Wednesday, November 28, 2018

PyScripter project of the week (November 26) at SourceForge

For the third time this year, PyScripter was selected as one of the projects of the week (November 26th) by SourceForge. 

Thursday, November 15, 2018

PyScripter v3.5.1 released

PyScripter 3.5.1 is now available at SourceForge.  This is a hotfix release fixing an issue with GUI scripts not showing.

Wednesday, November 14, 2018

PyScripter v3.5 released

PyScripter 3.5.0 is now available at Sourceforge.  There is a range of important new features in this release:

New features: 


Issues addressed: 

Wednesday, October 31, 2018

Firewal issues resolved in forthcoming PyScripter 3.5

PyScripter, with the remote python engine option, runs python in a sub-process and communicates with it using sockets.  The connection is local and does not present a security risk.  As stated in an earlier post, in case the Firewall is an issue:  Go to Control Panel\System and Security\Windows Defender Firewall\Customise Settings and make sure the "Notify me when Windows Defender blocks a new app" is checked. It is checked by default.

However there are users running under strictly controlled corporate environments in which even these "innocent" local TCP/IP connections are not allowed.  So a few users could not load and connect to python.  What can be done with the current version is:

  • Enable the Internal Python Engine (Tools, Options, IDE options, Python, uncheck "Internal Interpreter hidden).
  • Then go to the Python Versions dialog and try to load a python version. 
The forthcoming version 3.5 offers another option: to communicate with the python engine using Windows named pipes.  There is no change in the user experience and it works faster than socket communication.  The big advantage is that this bypasses firewall issues, since it does not use sockets. For PyScripter to be able to use named pipes the python module pywin32 needs to be installed in your python version.  Conda releases include the module.  If you do a fresh install with versions from www.python.org you can add this module by issuing the command;

> pip install pywin32

at the command prompt or using the pip External tool in PyScripter.  If the module is not available in your python version PyScripter will revert to using sockets as before.  There is a new IDE option "Always use sockets" that will prevent PyScripter from using named pipes.  This option is on by default.  So if your firewall prevents for using the remote python engine, you should switch this option off.  (Tools, Options, IDE Options, Python Interpreter, "Always use sockets").

Monday, October 29, 2018

PyScripter understands type hints

The forthcoming version of PyScripter supports python 3 type hints. The main use of type hints by pyscripter is to improve code completion.  See for instance the following example.  (shame blogger does not provide code formatting)

class Airport:
    def __init__(self, name:str):
      self._name = name
    @property
    def location(self) -> str:
        return self._name
class Flight:
    def __init__(self, origin:str, dest:str):
        self.origin = origin
        self.dest = dest
class Plane:
    def do_flight(self, fligth:Flight):
        origin = fligth.origin  #code completion flight.
        dest = fligth.dest
        print("I am flying from {origin} to {dest}".format(origin=origin, dest=dest))
def catch_plane() -> Plane:
    return Plane();
Venizelos = Airport("Athens")
Fiumicino = Airport("Rome")
plane = catch_plane()
plane.do_flight(Flight(Venizelos.location, Fiumicino.location)) #code completion plane.

If you want full type checking of your code you can setup mypy as an external tool.

Thursday, October 25, 2018

Using PyScripter with QGIS

QGIS is a free and open source GIS System.  However it comes with an unusual setup.  To use it with Pyscripter you need to:

  • copy  python3.exe and python36.dll (or python37.dll for recent versions) from the bin folder (osgeo4w\bin) to the python folder (osgeo4w\apps\Python36 or osgeo4w\apps\Python36)
  • rename python3.exe to python.exe
Then the installation is similar to the ones described here

Using PyScripter with ArcGIS Pro

You can easily setup PyScripter to work with ArcGIS Pro.  Since ArcGIS Pro is a 64bit application you need to have Windows 64 bits.  Make sure you have installed PyScripter 64bits.
  • Install ArcGIS Pro.  I have used a single user installation and the product was installed in C:\Users\username\AppData\Local\Programs\ArcGIS\Pro.
  • Start PyScripter 64bit v 3.4,2
  • Go to the Python Versions dialog (Run, Python Versions, Setup Python..)
  • Add a new version pressing the + button and select the path C:\Users\username\AppData\Local\Programs\ArcGIS\Pro\bin\Python\envs\arcgispro-py3
  • Activated the new unregistered version and pressing the first button
  • If you get a firewall notification allow the connection and voila

In case the Firewall is an issue:

Go to Control Panel\System and Security\Windows Defender Firewall\Customise Settings and make sure the "Notify me when Windows Defender blocks a new app" is checked. It is checked by default.

Wednesday, October 17, 2018

PyScripter project of the week at Sourceforge

PyScripter has been included in the projects of the week selection by SourceForge for the second time recently.  

New Feature: Run and Debug files on remote Windows and Linux machines using SSH

As hinted, the forthcoming version 3.5 of PyScripter will allow you to run and debug scripts on remote Windows and Linux SSH servers.  It introduces a new type of engine called "SSH engine",   which runs a python interpreter in a remote Windows or Linux computer or inside a virtual machine.  You first need to define one or more SSH servers as explained here .  This post also describes the requirements for using SSH with PyScripter.  Once you choose this type of engine you need to select a defined SSH server. PyScripter starts a python engine on the remote server using SSH and communicates with it using rpyc.  You can then run and debug remote or local scripts on the SSH server as if the scripts were running locally.  You can also use python running inside the SSH server with the Python Interactive Interpreter. While debugging, tracing into remote modules works transparently for the user.  If you are running python 2.x locally the remote version also needs to be 2.x and similarly if you run python version 3.x locally the remote version needs to be 3.x.  Beyond this constraint, the local and remote versions do not need to be the same.

Friday, October 5, 2018

Working with Remote Files. Preview of new feature.

In the next version, Pyscripter will support working with remote files i.e. files that may reside in different computers (servers) including Windows and Linux machines. You will be able to open, edit run debug and save back these files.  They work seamlessly with other PyScripter features such as the Recent File list, project files, and Run Configurations.
Requirements
To use PyScripter with remote files your computer need to have SSH client capabilities at the computer running PyScripter and an SSH server running on the remote computer.  SSH is a widely used network protocol for securely connecting to remote machines.  Windows 10 since the April 2018 update includes SSH. With earlier versions of Windows 10 you need to manually enable SSH through "Enable Optional Features".  For other versions of Windows you can install the latest version of OpenSSH for Windows using the provided installation instructions.

Configuring the SSH client side
Pyscripter requires password-less authentication using rsa keys.  You need to create the rsa keys and add them to the ssh-agent service which needs to be running.  Your public key needs to be added to the ~/.ssh/authorised_keys file on the server side.  Instructions are provided here.



Configuring the SSH server side

The SSH server service (sshd) and SSH agent service (ssh-agent) need to be running on the server side.  This is most likely true for Linux machines.  In Windows machines you need to start the server using the
    net start sshd
    net start ssh-agent
commands.   You can also configure these services to run automatically.

Testing the SSH connection
From a command prompt issue the following command:
    ssh username@hostname

where username is the user name on the server side and host name is the IP address of the SSH server.  If this works and you see the server shell, then PyScripter is ready to use the Server.




Opening remote files

You can open remote files using the File Menu.  You are then shown the Open Remote File dialog shown below:



In this dialog box you provide the path to the remote file and select an SSH server from a drop-down list.  You can also setup your SSH servers by pressing the button next to the SSH server field.   In PyScripter remote file names are shown in the UNC format \\server name\filepath.
Setting up SSH Servers


In this dialog box you add remove or modify SSH servers.  
Editing SSH sever information


For each SSH server you need to provide a Name that will be used to identify the server, as well as the user name and host name (or IP address) that will be used to connect to the server.  You also need to provide the command that will be used to execute Python on the server.

Sunday, September 9, 2018

PyScripter version 3.4.2 released

PyScripter 3.4.2 is now available at Sourceforge.  This is a maintenance release with some new features and many bug fixes.
New features:
  • New Edit Command Read Only (#883)
  • Files opened by PyScripter from the Python directory during debugging are read only by default to prevent accidental changes.
  • Close All to the Right Editor command added (#886)
  • New editor parameter [$-CurLineNumber] (#864)
  • New IDE Option "File Explorer background processing”. Set to false if you get File Explorer errors.
  • Console output including multiprocessing is now shown in interpreter (#891)
Issues addressed:

Saturday, May 5, 2018

PyScripter v3.4.0 released

PyScripter 3.4.0 is now available at Sourceforge.  The major new feature is the ability to switch Python versions without exiting PyScripter.  Support for virtual environments (venv and virtualenv) and conda distributions is provided out-of-the-box.  So there is no longer a need to fiddle with environment variables and command files to work with them.

New features:
Issues addressed:

Tuesday, May 1, 2018

New feature: switching python versions

A new feature that has been added to PyScripter and will be available in PyScrpter 3.4 is the ability to switch python versions without exiting PyScripter.


You can easily switch versions from the Python versions submenu (below) accessible from the Run menu, the application toolbar and the Python interpreter submenu.


Registered python versions are automatically detected and listed and you can add unregistered Python versions using the Setup Python dialog box:


You can add new versions by selecting the directory in which they are installed.  You can test, show in File Explorer and open a command prompt on existing python installations.   Virtual envrironments (both virtualenv and venv) and conda installations are supported and work out-of-the-box.  The python configurations are persisted, so you can pick your work in PyScripter next time you use it from where you left it.



Thursday, April 19, 2018

Tips for working with code folding

Here are some tips for working with code folding:
  • Bird's eye view of a module:
    • A. Fold All
    • B Unfold classes
  • Fold/unfold whole functions:
    • A. Unfold All
    • B Fold functions
    • Now when you unfold a function it appears fully unfolded. If you want to fold it back just fold it with the mouse or with cursor on the function def select Fold Nearest.
  • Fold out of a heavily nested function
    • Press Ctrl+/ (Fold Nearest) a few times until you fold up to the level you want.

Sunday, April 15, 2018

Benchmark of Regular Expression Engines

I did some benchmarking of regular expression engines and the results are quite interesting.  The benchmark involved finding all matches of different patterns in a 15 Mb text file.  It is a similar benchmark to that found in other comparisons of regular expression engines (here and here).  The following engines were compared.
  • Delphi’s built-in engine (PCRE)
  • A modified version of Jcl’s regular expression engine, also PCRE based.  Three versions of this set up were tested:
    • with Study and JIT enabled
    • with Study and no JIT
    • without Study and JIT
  • Python’s built-in regular expression engine and
  • A relative new comer FLRE a pascal-based regular expression engine.
Here follow the results:
                                                        Time     | Match count
==============================================================================
Delphi's own TRegEx:
                                         /Twain/ :       35.00 ms |         811
                                     /(?i)Twain/ :       69.00 ms |         965
                                    /[a-z]shing/ :      510.00 ms |        1540
                    /Huck[a-zA-Z]+|Saw[a-zA-Z]+/ :      581.00 ms |         262
                                     /\b\w+nn\b/ :      548.00 ms |         262
                              /[a-q][^u-z]{13}x/ :      566.00 ms |        4094
                   /Tom|Sawyer|Huckleberry|Finn/ :      743.00 ms |        2598
               /(?i)Tom|Sawyer|Huckleberry|Finn/ :      875.00 ms |        4152
           /.{0,2}(Tom|Sawyer|Huckleberry|Finn)/ :     2617.00 ms |        2598
           /.{2,4}(Tom|Sawyer|Huckleberry|Finn)/ :     2814.00 ms |        1976
             /Tom.{10,25}river|river.{10,25}Tom/ :      421.00 ms |           2
                                  /[a-zA-Z]+ing/ :      763.00 ms |       78423
                         /\s[a-zA-Z]{0,12}ing\s/ :      485.00 ms |       55201
                 /([A-Za-z]awyer|[A-Za-z]inn)\s/ :     1468.00 ms |         209
                     /["'][^"']{0,30}[?!\.]["']/ :      302.00 ms |        8885
Total Time:    12812.00 ms
==============================================================================
Modified TJclWideRegEx with Study and JIT:
                                         /Twain/ :        9.00 ms |         811
                                     /(?i)Twain/ :       30.00 ms |         965
                                    /[a-z]shing/ :       74.00 ms |        1540
                    /Huck[a-zA-Z]+|Saw[a-zA-Z]+/ :       17.00 ms |         262
                                     /\b\w+nn\b/ :      115.00 ms |         262
                              /[a-q][^u-z]{13}x/ :      181.00 ms |        4094
                   /Tom|Sawyer|Huckleberry|Finn/ :       18.00 ms |        2598
               /(?i)Tom|Sawyer|Huckleberry|Finn/ :       50.00 ms |        4152
           /.{0,2}(Tom|Sawyer|Huckleberry|Finn)/ :      194.00 ms |        2598
           /.{2,4}(Tom|Sawyer|Huckleberry|Finn)/ :      216.00 ms |        1976
             /Tom.{10,25}river|river.{10,25}Tom/ :       24.00 ms |           2
                                  /[a-zA-Z]+ing/ :      168.00 ms |       78423
                         /\s[a-zA-Z]{0,12}ing\s/ :       97.00 ms |       55248
                 /([A-Za-z]awyer|[A-Za-z]inn)\s/ :       95.00 ms |         209
                     /["'][^"']{0,30}[?!\.]["']/ :       25.00 ms |        8885
Total Time:     1336.00 ms
==============================================================================
Modified TJclWideRegEx with Study no JIT:
                                         /Twain/ :       11.00 ms |         811
                                     /(?i)Twain/ :       42.00 ms |         965
                                    /[a-z]shing/ :      272.00 ms |        1540
                    /Huck[a-zA-Z]+|Saw[a-zA-Z]+/ :       19.00 ms |         262
                                     /\b\w+nn\b/ :      418.00 ms |         262
                              /[a-q][^u-z]{13}x/ :      384.00 ms |        4094
                   /Tom|Sawyer|Huckleberry|Finn/ :       23.00 ms |        2598
               /(?i)Tom|Sawyer|Huckleberry|Finn/ :      209.00 ms |        4152
           /.{0,2}(Tom|Sawyer|Huckleberry|Finn)/ :     2664.00 ms |        2598
           /.{2,4}(Tom|Sawyer|Huckleberry|Finn)/ :     2730.00 ms |        1976
             /Tom.{10,25}river|river.{10,25}Tom/ :       45.00 ms |           2
                                  /[a-zA-Z]+ing/ :      627.00 ms |       78423
                         /\s[a-zA-Z]{0,12}ing\s/ :      279.00 ms |       55248
                 /([A-Za-z]awyer|[A-Za-z]inn)\s/ :      593.00 ms |         209
                     /["'][^"']{0,30}[?!\.]["']/ :       40.00 ms |        8885
Total Time:     8389.00 ms
==============================================================================
Modified TJclWideRegEx no Study no JIT:
                                         /Twain/ :       10.00 ms |         811
                                     /(?i)Twain/ :       43.00 ms |         965
                                    /[a-z]shing/ :      341.00 ms |        1540
                    /Huck[a-zA-Z]+|Saw[a-zA-Z]+/ :      383.00 ms |         262
                                     /\b\w+nn\b/ :      500.00 ms |         262
                              /[a-q][^u-z]{13}x/ :      659.00 ms |        4094
                   /Tom|Sawyer|Huckleberry|Finn/ :      716.00 ms |        2598
               /(?i)Tom|Sawyer|Huckleberry|Finn/ :      984.00 ms |        4152
           /.{0,2}(Tom|Sawyer|Huckleberry|Finn)/ :     2769.00 ms |        2598
           /.{2,4}(Tom|Sawyer|Huckleberry|Finn)/ :     3130.00 ms |        1976
             /Tom.{10,25}river|river.{10,25}Tom/ :      409.00 ms |           2
                                  /[a-zA-Z]+ing/ :      845.00 ms |       78423
                         /\s[a-zA-Z]{0,12}ing\s/ :      501.00 ms |       55248
                 /([A-Za-z]awyer|[A-Za-z]inn)\s/ :      815.00 ms |         209
                     /["'][^"']{0,30}[?!\.]["']/ :      281.00 ms |        8885
Total Time:    12411.00 ms

==============================================================================           Python Regular Expressions
Twain                                    time:    0.00505 found mathces:    811
(?i)Twain                                time:      0.209 found mathces:    965
[a-z]shing                               time:       0.24 found mathces:   1540
Huck[a-zA-Z]+|Saw[a-zA-Z]+               time:     0.0807 found mathces:    262
\b\w+nn\b                                time:      0.513 found mathces:    262
[a-q][^u-z]{13}x                         time:      0.685 found mathces:   4081
Tom|Sawyer|Huckleberry|Finn              time:     0.0715 found mathces:   2598
(?i)Tom|Sawyer|Huckleberry|Finn          time:       0.93 found mathces:   4152
.{0,2}(Tom|Sawyer|Huckleberry|Finn)      time:      0.957 found mathces:   2598
.{2,4}(Tom|Sawyer|Huckleberry|Finn)      time:      0.935 found mathces:   1976
Tom.{10,25}river|river.{10,25}Tom        time:     0.0922 found mathces:      2
[a-zA-Z]+ing                             time:       0.52 found mathces:  78423
\s[a-zA-Z]{0,12}ing\s                    time:      0.299 found mathces:  55201
([A-Za-z]awyer|[A-Za-z]inn)\s            time:      0.358 found mathces:    209
["][^"]{0,30}[?!\.]["]                   time:     0.0175 found mathces:   5261
total time:       5910 ms

                                                        Time     | Match count
==============================================================================
FLRE:
                                         /Twain/ :        7.83 ms |         811
                                     /(?i)Twain/ :        4.78 ms |         965
                                    /[a-z]shing/ :        8.95 ms |        1540
                    /Huck[a-zA-Z]+|Saw[a-zA-Z]+/ :        8.14 ms |         262
                                     /\b\w+nn\b/ :       50.53 ms |         262
                              /[a-q][^u-z]{13}x/ :       94.96 ms |        4094
                   /Tom|Sawyer|Huckleberry|Finn/ :       12.24 ms |        2598
               /(?i)Tom|Sawyer|Huckleberry|Finn/ :       21.34 ms |        4152
           /.{0,2}(Tom|Sawyer|Huckleberry|Finn)/ :       47.25 ms |        2598
           /.{2,4}(Tom|Sawyer|Huckleberry|Finn)/ :       47.37 ms |        1976
             /Tom.{10,25}river|river.{10,25}Tom/ :       46.06 ms |           2
                                  /[a-zA-Z]+ing/ :       60.95 ms |       78423
                         /\s[a-zA-Z]{0,12}ing\s/ :       55.11 ms |       55248
                 /([A-Za-z]awyer|[A-Za-z]inn)\s/ :       10.76 ms |         209
                     /["'][^"']{0,30}[?!\.]["']/ :       49.21 ms |        8885
Total time:      542.93 ms



And the winner by a big margin is FLRE! 
Notes:
  • The time to read the file is not included in the timings.
  • PCRE with JIT is also quite impressive.  In other test it was found to compete well with the engines released by Intel and Google.  However I found the JIT is very buggy (crashes often) and limited (works only with very few options).

Sunday, April 8, 2018

Jupyter notebooks in PyScripter

The next version of PyScripter will support running Jupyter notebooks inside the IDE as shown in the picture below:
Capture

Jupiter notebooks are JSON files and PyScripter 3.4 provides syntax highlighting with code-folding for such files.   To work with Jupiter notebooks you first need to install jupiter using pip.  You can then select, Tools, Source Code Views, Web preview, to work inside the notebooks in the usual way.  A Jupiter server is automatically started to support this.

You can also open a new notebook through File, New... and selecting the Jupiter notebook file template.   You will be asked to save the empty notebook and then you will go straight into the new notebook to start work.  The support for Jupiter notebooks should be considered at this stage experimental.

Friday, April 6, 2018

PyScripter v3.3.2 released

This hotfix release resolves a problem that may occur when running/debugging GUI scripts and a few minor other minor issues.   It is available at Sourceforge.

Sunday, April 1, 2018

Turning your scripts into executables

Sometimes you may want to distribute your python work as a single .exe file.   This post explains how to do it easily with PyScripter.

  • If you do not see “Install packages with pip” under Tools Tools you first need to create a new Tool that helps you to use pip from PyScripter as explained in a separate blog post.
  • Use the pip tool to install pyinstaller.
  • Setup a new tool to use PyInstaller using Tools, Configure Tools, Add and completing the dialog box as shown below:

Capture

  • Open in editor the script and invoke the new tool.  You can watch the pyinstaller output in the Output window.  After a short while and if everything goes smoothly your executable will be ready and can be found in a folder called “dist”, below your script.
  • You could create another tool to easily test the generated executable, but I will leave that as a little challenge.

Friday, March 23, 2018

PyScripter v3.3.1 released

This is a hotfix release. It fixed an error in Tools, Options, IDE Options.   It is available at Sourceforge.

Wednesday, March 21, 2018

Pyscripter version 3.3.0 released

PyScripter 3.3.0 is now available at Sourceforge.  The major change in this version is the addition of thread debugging.

New features:
  • Thread debugging (#455)
  • Much faster python output redirection
  • Form Layout and placement stored in PyScripter.local.ini
Issues addressed:

Saturday, March 10, 2018

Thread Debugging

The next version of PyScripter will contain support for debugging multi-threaded python applications.  This blog post provides a quick preview of how thread debugging works.  The following python script will be used for demonstration purposes:

import time
import threading
import logging
logging.basicConfig(level=logging.DEBUG,
                    format='(%(threadName)-10s) %(message)s',
                    )
class MyThread(threading.Thread):
    def run(self):
        logging.debug('running')
        time.sleep(3)
        return
threads =[]
for i in range(5):
    t = MyThread()
    t.start()
    threads += [t]
for t in threads:
    t.join()

The scripts creates and starts 5 threads and waits for the threads to finish.  The following layout is suggested for debugging:


At the top you have the Call Stack and Variables windows and at the bottom the Interpreter and the Watches windows.  The Call Stack window includes a list of active threads.

We have placed a breakpoint inside the run method of our thread and one at the loop that waits for the threads to finish.  After we start debugging (F9 function key) we can see threads getting added to the Threads list as they are created.  After a short-while all 5 created threads will be stopped at the breakpoint and the Main Thread will stop at the second breakpoint.   The Call Stack Window will look like this:


The pinned thread is the active "broken" thread and the pinned frame is the active frame of the active thread.  The Variable window displays the namespace of the active frame and the Watches window evaluates watch expressions inside the active frame.   Also commands we issue in the interpreter window and debugger hints (hovering the mouse on variable names in the editor) are also evaluated inside the active frame.   We can change the active thread and the active frame be selecting with the mouse a different one.  For example this is what the Call Stack window looks like if we activate Thread-4.


The editor window shows the statement at which the active broken thread has stopped.


The Resume command (F9) resumes execution of all broken threads.  All other debug commands (e.g. Step in, Step over, Step out) resume execution of the active thread only.  For example if we select the Main Thread and select Step Over a couple of times the main thread will lock waiting for the other threads to finish.   This is what the Call Stack will look like:


The Main thread is in running state, but the other threads are broken.  We can step over or into any of the broken threads or we can resume execution of all "broken" threads pressing (F9).  If we press F9 we can observe the threads going into running state and then disappearing one after the other as they get finished. Eventually execution will stop at the breakpoint of the Main Thread which will become "broken".  After a few steps (F8) the python script will exit and debugging will be completed.

PyScripter makes thread debugging easy and fun!




Saturday, January 27, 2018

Pyscripter version 3.2.2 released

This is a hotfix release. It restores compatibility with Python 3.7a, which was broken due to some changes to the C API.   It is available at Sourceforge.

Wednesday, January 24, 2018

Pyscripter version 3.2.1 released

This is a hotfix release. It addresses a regression due to which, in some situations, Unix line breaks were converted to Windows line breaks upon saving files.  It also includes optimizations that significantly reduce the memory footprint of PyScripter.  It is available at Sourceforge.

Monday, January 15, 2018

DPI awareness

The new version of PyScripter is DPI Aware.  This means that by default on high DPI screens PyScripter will do its own scaling and will not rely on the scaling carried out by the operating system (Windows).  Users with high DPI screens will see a considerable improvement in the way texts rendered and blurry text will no longer be an issue.  Other users will monitors having the common 96 pixels per inch resolution, should not observe any noticeable difference.

If however you want to go back and rely on scaling carried out by Windows, you can do that if you are using Windows 10 and have the Creators Update installed.  Find the executable file of PyScripter under Program Files, right click and select Properties.  In the Compatibility tab check “Override high DPI scaling behaviour” and in the dropdown box select System (Enhanced) as shown below.


image

Pyscripter version 3.2.0 released

PyScripter 3.2.0 is now available at Sourceforge.  The major change in this version, is that now PyScripter is DPI Aware.   For those of you working with high DPI screens, such as those found in modern laptops, this means that text in the PyScripter editor will now be much crisper and easier to the eyes.  Here follows a list of issues addressed