Add tpong to examples list

Add tpong to examples list

= tcell

image:https://img.shields.io/travis/gdamore/tcell.svg?label=linux[Linux Status,link="https://travis-ci.org/gdamore/tcell"]
image:https://img.shields.io/appveyor/ci/gdamore/tcell.svg?label=windows[Windows Status,link="https://ci.appveyor.com/project/gdamore/tcell"]
image:https://img.shields.io/badge/license-APACHE2-blue.svg[Apache License,link="https://github.com/gdamore/tcell/blob/master/LICENSE"]
image:https://img.shields.io/badge/godoc-reference-blue.svg[GoDoc,link="https://godoc.org/github.com/gdamore/tcell"]
image:http://goreportcard.com/badge/gdamore/tcell[Go Report Card,link="http://goreportcard.com/report/gdamore/tcell"]
image:https://img.shields.io/discord/639503822733180969?label=discord[Discord,link="https://discord.gg/urTTxDN"]
image:https://codecov.io/gh/gdamore/tcell/branch/master/graph/badge.svg[codecov,link="https://codecov.io/gh/gdamore/tcell"]

[cols="2",grid="none"]
|===
|_Tcell_ is a _Go_ package that provides a cell based view for text terminals, like _xterm_.
It was inspired by _termbox_, but includes many additional improvements.
a|[.right]
image::logos/tcell.png[float="right"]
|===

## Examples

* https://github.com/gdamore/proxima5[proxima5] - space shooter (https://youtu.be/jNxKTCmY_bQ[video])
* https://github.com/gdamore/govisor[govisor] - service management UI (http://2.bp.blogspot.com/--OsvnfzSNow/Vf7aqMw3zXI/AAAAAAAAARo/uOMtOvw4Sbg/s1600/Screen%2BShot%2B2015-09-20%2Bat%2B9.08.41%2BAM.png[screenshot])
* mouse demo - included mouse test (http://2.bp.blogspot.com/-fWvW5opT0es/VhIdItdKqJI/AAAAAAAAATE/7Ojc0L1SpB0/s1600/Screen%2BShot%2B2015-10-04%2Bat%2B11.47.13%2BPM.png[screenshot])
* https://github.com/gdamore/gomatrix[gomatrix] - converted from Termbox
* https://github.com/zyedidia/micro/[micro] - lightweight text editor with syntax-highlighting and themes
* https://github.com/viktomas/godu[godu] - simple golang utility helping to discover large files/folders.
* https://github.com/rivo/tview[tview] - rich interactive widgets for terminal UIs
* https://github.com/marcusolsson/tui-go[tui-go] - UI library for terminal apps (_deprecated_)
* https://github.com/rgm3/gomandelbrot[gomandelbrot] - Mandelbrot!
* https://github.com/senorprogrammer/wtf[WTF]- Personal information dashboard for your terminal
* https://github.com/browsh-org/browsh[browsh] - A fully-modern text-based browser, rendering to TTY and browsers (https://www.youtube.com/watch?v=HZq86XfBoRo[video])
* https://github.com/sachaos/go-life[go-life] - Conway's Game of Life.
* https://github.com/gcla/gowid[gowid] - compositional widgets for terminal UIs, inspired by urwid
* https://termshark.io[termshark] - a terminal UI for tshark, inspired by Wireshark, built on gowid
* https://github.com/MichaelS11/go-tetris[go-tetris] - Go Tetris with AI option
* https://github.com/junegunn/fzf[fzf] - A command-line fuzzy finder
* https://github.com/esimov/ascii-fluid[ascii-fluid] - A terminal based ASCII fluid simulation controlled by webcam
* https://gitlab.com/tslocum/cbind[cbind] - Provides key event encoding, decoding and handling
* https://github.com/spinzed/tpong[tpong] - The old-school Pong remade in terminal

## Pure Go Terminfo Database

_Tcell_ includes a full parser and expander for terminfo capability strings,
so that it can avoid hard coding escape strings for formatting.  It also favors
portability, and includes support for all POSIX systems.

The database is also flexible & extensible, and can modified by either running
a program to build the entire database, or an entry for just a single terminal.

## More Portable

_Tcell_ is portable to a wide variety of systems.
_Tcell_ is believed
to work with all of the systems officially supported by golang with
the exception of nacl (which lacks any kind of a terminal interface).
(Plan9 is not supported by _Tcell_, but it is experimental status only
in golang.)  For all of these systems *except Solaris/illumos*, _Tcell_
is pure Go, with no need for CGO.

## No Async IO

_Tcell_ is able to operate without requiring `SIGIO` signals (unlike _termbox_),
or asynchronous I/O, and can instead use standard Go file
objects and Go routines.
This means it should be safe, especially for
use with programs that use exec, or otherwise need to manipulate the
tty streams.
This model is also much closer to idiomatic Go, leading
to fewer surprises.

## Rich Unicode & non-Unicode support

_Tcell_ includes enhanced support for Unicode, including wide characters and
combining characters, provided your terminal can support them.
Note that
Windows terminals generally don't support the full Unicode repertoire.

It will also convert to and from Unicode locales, so that the program
can work with UTF-8 internally, and get reasonable output in other locales.
_Tcell_ tries hard to convert to native characters on both input and output, and
on output _Tcell_ even makes use of the alternate character set to facilitate
drawing certain characters.

## More Function Keys

_Tcell_ also has richer support for a larger number of special keys that some terminals can send.

## Better Color Handling

_Tcell_ will respect your terminal's color space as specified within your terminfo
entries, so that for example attempts to emit color sequences on VT100 terminals
won't result in unintended consequences.

In Windows mode, _Tcell_ supports 16 colors, bold, dim, and reverse,
instead of just termbox's 8 colors with reverse.  (Note that there is some
conflation with bold/dim and colors.)

_Tcell_ maps 16 colors down to 8, for terminals that need it.
(The upper 8 colors are just brighter versions of the lower 8.)

## Better Mouse Support

_Tcell_ supports enhanced mouse tracking mode, so your application can receive
regular mouse motion events, and wheel events, if your terminal supports it.

## _Termbox_ Compatibility

A compatibility layer for _termbox_ is provided in the `compat` directory.
To use it, try importing `github.com/gdamore/tcell/termbox`
instead.  Most _termbox-go_ programs will probably work without further
modification.

## Working With Unicode

Internally Tcell uses UTF-8, just like Go.
However, Tcell understands how to
convert to and from other character sets, using the capabilities of
the `golang.org/x/text/encoding packages`.
Your application must supply
them, as the full set of the most common ones bloats the program by about 2MB.
If you're lazy, and want them all anyway, see the `encoding` sub-directory.

## Wide & Combining Characters

The `SetContent()` API takes a primary rune, and an optional list of combining runes.
If any of the runes is a wide (East Asian) rune occupying two cells,
then the library will skip output from the following cell, but care must be
taken in the application to avoid explicitly attempting to set content in the
next cell, otherwise the results are undefined.  (Normally wide character
is displayed, and the other character is not; do not depend on that behavior.)

Experience has shown that the vanilla Windows 8 console application does not
support any of these characters properly, but at least some options like
_ConEmu_ do support Wide characters.

## Colors

_Tcell_ assumes the ANSI/XTerm color model, including the 256 color map that
XTerm uses when it supports 256 colors.  The terminfo guidance will be
honored, with respect to the number of colors supported.  Also, only
terminals which expose ANSI style `setaf` and `setab` will support color;
if you have a color terminal that only has `setf` and `setb`, please let me
know; it wouldn't be hard to add that if there is need.

## 24-bit Color

_Tcell_ _supports true color_!  (That is, if your terminal can support it,
_Tcell_ can accurately display 24-bit color.)

To use 24-bit color, you need to use a terminal that supports it.  Modern
xterm and similar teminal emulators can support this.  As terminfo lacks any
way to describe this capability, we fabricate the capability for
terminals with names ending in `*-truecolor`.  The stock distribution ships
with a database that defines `xterm-truecolor`.
To try it out, set your
`TERM` variable to `xterm-truecolor`.

When using TrueColor, programs will display the colors that the programmer
intended, overriding any "`themes`" you may have set in your terminal
emulator.  (For some cases, accurate color fidelity is more important
than respecting themes.  For other cases, such as typical text apps that
only use a few colors, its more desirable to respect the themes that
the user has established.)

If you find this undesirable, you can either use a `TERM` variable
that lacks the `TRUECOLOR` setting, or set `TCELL_TRUECOLOR=disable` in your
environment.

## Performance

Reasonable attempts have been made to minimize sending data to terminals,
avoiding repeated sequences or drawing the same cell on refresh updates.

## Terminfo

(Not relevent for Windows users.)

The Terminfo implementation operates with two forms of database.  The first
is the built-in go database, which contains a number of real database entries
that are compiled into the program directly.  This should minimize calling
out to database file searches.

The second is in the form of JSON files, that contain the same information,
which can be located either by the `$TCELLDB` environment file, `$HOME/.tcelldb`,
or is located in the Go source directory as `database.json`.

These files (both the Go and the JSON files) can be generated using the
mkinfo.go program.  If you need to regnerate the entire set for some reason,
run the mkdatabase.sh file.  The generation uses the infocmp(1) program on
the system to collect the necessary information.

The `mkinfo.go` program can also be used to generate specific database entries
for named terminals, in case your favorite terminal is missing.  (If you
find that this is the case, please let me know and I'll try to add it!)

_Tcell_ requires that the terminal support the `cup` mode of cursor addressing.
Terminals without absolute cursor addressability are not supported.
This is unlikely to be a problem; such terminals have not been mass produced
since the early 1970s.

## Mouse Support

Mouse support is detected via the `kmous` terminfo variable, however,
enablement/disablement and decoding mouse events is done using hard coded
sequences based on the XTerm X11 model.  As of this writing all popular
terminals with mouse tracking support this model.  (Full terminfo support
is not possible as terminfo sequences are not defined.)

On Windows, the mouse works normally.

Mouse wheel buttons on various terminals are known to work, but the support
in terminal emulators, as well as support for various buttons and
live mouse tracking, varies widely.  Modern _xterm_, macOS _Terminal_, and _iTerm_ all work well.

## Testablity

There is a `SimulationScreen`, that can be used to simulate a real screen
for automated testing.  The supplied tests do this.  The simulation contains
event delivery, screen resizing support, and capabilities to inject events
and examine "`physical`" screen contents.

## Platforms

### POSIX (Linux, FreeBSD, macOS, Solaris, etc.)

For mainstream systems with a suitably well defined system call interface
to tty settings, everything works using pure Go.

For the remainder (right now means only Solaris/illumos) we use POSIX function
calls to manage termios, which implies that CGO is required on those platforms.

### Windows

Windows console mode applications are supported.  Unfortunately _mintty_
and other _cygwin_ style applications are not supported.

Modern console applications like ConEmu, as well as the Windows 10
console itself, support all the good features (resize, mouse tracking, etc.)

I haven't figured out how to cleanly resolve the dichotomy between cygwin
style termios and the Windows Console API; it seems that perhaps nobody else
has either.  If anyone has suggestions, let me know!  Really, if you're
using a Windows application, you should use the native Windows console or a
fully compatible console implementation.

### Plan9 and Native Client (Nacl)

The nacl and plan9 platforms won't work, but compilation stubs are supplied
for folks that want to include parts of this in software targetting those
platforms.  The Simulation screen works, but as Tcell doesn't know how to
allocate a real screen object on those platforms, `NewScreen()` will fail.

If anyone has wisdom about how to improve support for either of these,
please let me know.  PRs are especially welcome.

### Commercial Support

_Tcell_ is absolutely free, but if you want to obtain commercial, professional support, there are options.

[cols="2",align="center",frame="none", grid="none"]
|===
^.^|
image:logos/tidelift.png[100,100]
a|
https://tidelift.com/[Tidelift] subscriptions include support for _Tcell_, as well as many other open source packages.

^.^|
image:logos/staysail.png[100,100]
a|
mailto:info@staysail.tech[Staysail Systems, Inc.] offers direct support, and custom development around _Tcell_ on an hourly basis.

^.^|
image:logos/patreon.png[100,100]
a|I also welcome donations at https://www.patreon.com/gedamore/[Patreon], if you just want to make a contribution.
|===

= tcell

image:https://img.shields.io/travis/gdamore/tcell.svg?label=linux[Linux Status,link="https://travis-ci.org/gdamore/tcell"]
image:https://img.shields.io/appveyor/ci/gdamore/tcell.svg?label=windows[Windows Status,link="https://ci.appveyor.com/project/gdamore/tcell"]
image:https://img.shields.io/badge/license-APACHE2-blue.svg[Apache License,link="https://github.com/gdamore/tcell/blob/master/LICENSE"]
image:https://img.shields.io/badge/godoc-reference-blue.svg[GoDoc,link="https://godoc.org/github.com/gdamore/tcell"]
image:http://goreportcard.com/badge/gdamore/tcell[Go Report Card,link="http://goreportcard.com/report/gdamore/tcell"]
image:https://img.shields.io/discord/639503822733180969?label=discord[Discord,link="https://discord.gg/urTTxDN"]
image:https://codecov.io/gh/gdamore/tcell/branch/master/graph/badge.svg[codecov,link="https://codecov.io/gh/gdamore/tcell"]

[cols="2",grid="none"]
|===
|_Tcell_ is a _Go_ package that provides a cell based view for text terminals, like _xterm_.
It was inspired by _termbox_, but includes many additional improvements.
a|[.right]
image::logos/tcell.png[float="right"]
|===

## Examples

* https://github.com/gdamore/proxima5[proxima5] - space shooter (https://youtu.be/jNxKTCmY_bQ[video])
* https://github.com/gdamore/govisor[govisor] - service management UI (http://2.bp.blogspot.com/--OsvnfzSNow/Vf7aqMw3zXI/AAAAAAAAARo/uOMtOvw4Sbg/s1600/Screen%2BShot%2B2015-09-20%2Bat%2B9.08.41%2BAM.png[screenshot])
* mouse demo - included mouse test (http://2.bp.blogspot.com/-fWvW5opT0es/VhIdItdKqJI/AAAAAAAAATE/7Ojc0L1SpB0/s1600/Screen%2BShot%2B2015-10-04%2Bat%2B11.47.13%2BPM.png[screenshot])
* https://github.com/gdamore/gomatrix[gomatrix] - converted from Termbox
* https://github.com/zyedidia/micro/[micro] - lightweight text editor with syntax-highlighting and themes
* https://github.com/viktomas/godu[godu] - simple golang utility helping to discover large files/folders.
* https://github.com/rivo/tview[tview] - rich interactive widgets for terminal UIs
* https://github.com/marcusolsson/tui-go[tui-go] - UI library for terminal apps (_deprecated_)
* https://github.com/rgm3/gomandelbrot[gomandelbrot] - Mandelbrot!
* https://github.com/senorprogrammer/wtf[WTF]- Personal information dashboard for your terminal
* https://github.com/browsh-org/browsh[browsh] - A fully-modern text-based browser, rendering to TTY and browsers (https://www.youtube.com/watch?v=HZq86XfBoRo[video])
* https://github.com/sachaos/go-life[go-life] - Conway's Game of Life.
* https://github.com/gcla/gowid[gowid] - compositional widgets for terminal UIs, inspired by urwid
* https://termshark.io[termshark] - a terminal UI for tshark, inspired by Wireshark, built on gowid
* https://github.com/MichaelS11/go-tetris[go-tetris] - Go Tetris with AI option
* https://github.com/junegunn/fzf[fzf] - A command-line fuzzy finder
* https://github.com/esimov/ascii-fluid[ascii-fluid] - A terminal based ASCII fluid simulation controlled by webcam
* https://gitlab.com/tslocum/cbind[cbind] - Provides key event encoding, decoding and handling

## Pure Go Terminfo Database

_Tcell_ includes a full parser and expander for terminfo capability strings,
so that it can avoid hard coding escape strings for formatting.  It also favors
portability, and includes support for all POSIX systems.

The database is also flexible & extensible, and can modified by either running
a program to build the entire database, or an entry for just a single terminal.

## More Portable

_Tcell_ is portable to a wide variety of systems.
_Tcell_ is believed
to work with all of the systems officially supported by golang with
the exception of nacl (which lacks any kind of a terminal interface).
(Plan9 is not supported by _Tcell_, but it is experimental status only
in golang.)  For all of these systems *except Solaris/illumos*, _Tcell_
is pure Go, with no need for CGO.

## No Async IO

_Tcell_ is able to operate without requiring `SIGIO` signals (unlike _termbox_),
or asynchronous I/O, and can instead use standard Go file
objects and Go routines.
This means it should be safe, especially for
use with programs that use exec, or otherwise need to manipulate the
tty streams.
This model is also much closer to idiomatic Go, leading
to fewer surprises.

## Rich Unicode & non-Unicode support

_Tcell_ includes enhanced support for Unicode, including wide characters and
combining characters, provided your terminal can support them.
Note that
Windows terminals generally don't support the full Unicode repertoire.

It will also convert to and from Unicode locales, so that the program
can work with UTF-8 internally, and get reasonable output in other locales.
_Tcell_ tries hard to convert to native characters on both input and output, and
on output _Tcell_ even makes use of the alternate character set to facilitate
drawing certain characters.

## More Function Keys

_Tcell_ also has richer support for a larger number of special keys that some terminals can send.

## Better Color Handling

_Tcell_ will respect your terminal's color space as specified within your terminfo
entries, so that for example attempts to emit color sequences on VT100 terminals
won't result in unintended consequences.

In Windows mode, _Tcell_ supports 16 colors, bold, dim, and reverse,
instead of just termbox's 8 colors with reverse.  (Note that there is some
conflation with bold/dim and colors.)

_Tcell_ maps 16 colors down to 8, for terminals that need it.
(The upper 8 colors are just brighter versions of the lower 8.)

## Better Mouse Support

_Tcell_ supports enhanced mouse tracking mode, so your application can receive
regular mouse motion events, and wheel events, if your terminal supports it.

## _Termbox_ Compatibility

A compatibility layer for _termbox_ is provided in the `compat` directory.
To use it, try importing `github.com/gdamore/tcell/termbox`
instead.  Most _termbox-go_ programs will probably work without further
modification.

## Working With Unicode

Internally Tcell uses UTF-8, just like Go.
However, Tcell understands how to
convert to and from other character sets, using the capabilities of
the `golang.org/x/text/encoding packages`.
Your application must supply
them, as the full set of the most common ones bloats the program by about 2MB.
If you're lazy, and want them all anyway, see the `encoding` sub-directory.

## Wide & Combining Characters

The `SetContent()` API takes a primary rune, and an optional list of combining runes.
If any of the runes is a wide (East Asian) rune occupying two cells,
then the library will skip output from the following cell, but care must be
taken in the application to avoid explicitly attempting to set content in the
next cell, otherwise the results are undefined.  (Normally wide character
is displayed, and the other character is not; do not depend on that behavior.)

Experience has shown that the vanilla Windows 8 console application does not
support any of these characters properly, but at least some options like
_ConEmu_ do support Wide characters.

## Colors

_Tcell_ assumes the ANSI/XTerm color model, including the 256 color map that
XTerm uses when it supports 256 colors.  The terminfo guidance will be
honored, with respect to the number of colors supported.  Also, only
terminals which expose ANSI style `setaf` and `setab` will support color;
if you have a color terminal that only has `setf` and `setb`, please let me
know; it wouldn't be hard to add that if there is need.

## 24-bit Color

_Tcell_ _supports true color_!  (That is, if your terminal can support it,
_Tcell_ can accurately display 24-bit color.)

To use 24-bit color, you need to use a terminal that supports it.  Modern
xterm and similar teminal emulators can support this.  As terminfo lacks any
way to describe this capability, we fabricate the capability for
terminals with names ending in `*-truecolor`.  The stock distribution ships
with a database that defines `xterm-truecolor`.
To try it out, set your
`TERM` variable to `xterm-truecolor`.

When using TrueColor, programs will display the colors that the programmer
intended, overriding any "`themes`" you may have set in your terminal
emulator.  (For some cases, accurate color fidelity is more important
than respecting themes.  For other cases, such as typical text apps that
only use a few colors, its more desirable to respect the themes that
the user has established.)

If you find this undesirable, you can either use a `TERM` variable
that lacks the `TRUECOLOR` setting, or set `TCELL_TRUECOLOR=disable` in your
environment.

## Performance

Reasonable attempts have been made to minimize sending data to terminals,
avoiding repeated sequences or drawing the same cell on refresh updates.

## Terminfo

(Not relevent for Windows users.)

The Terminfo implementation operates with two forms of database.  The first
is the built-in go database, which contains a number of real database entries
that are compiled into the program directly.  This should minimize calling
out to database file searches.

The second is in the form of JSON files, that contain the same information,
which can be located either by the `$TCELLDB` environment file, `$HOME/.tcelldb`,
or is located in the Go source directory as `database.json`.

These files (both the Go and the JSON files) can be generated using the
mkinfo.go program.  If you need to regnerate the entire set for some reason,
run the mkdatabase.sh file.  The generation uses the infocmp(1) program on
the system to collect the necessary information.

The `mkinfo.go` program can also be used to generate specific database entries
for named terminals, in case your favorite terminal is missing.  (If you
find that this is the case, please let me know and I'll try to add it!)

_Tcell_ requires that the terminal support the `cup` mode of cursor addressing.
Terminals without absolute cursor addressability are not supported.
This is unlikely to be a problem; such terminals have not been mass produced
since the early 1970s.

## Mouse Support

Mouse support is detected via the `kmous` terminfo variable, however,
enablement/disablement and decoding mouse events is done using hard coded
sequences based on the XTerm X11 model.  As of this writing all popular
terminals with mouse tracking support this model.  (Full terminfo support
is not possible as terminfo sequences are not defined.)

On Windows, the mouse works normally.

Mouse wheel buttons on various terminals are known to work, but the support
in terminal emulators, as well as support for various buttons and
live mouse tracking, varies widely.  Modern _xterm_, macOS _Terminal_, and _iTerm_ all work well.

## Testablity

There is a `SimulationScreen`, that can be used to simulate a real screen
for automated testing.  The supplied tests do this.  The simulation contains
event delivery, screen resizing support, and capabilities to inject events
and examine "`physical`" screen contents.

## Platforms

### POSIX (Linux, FreeBSD, macOS, Solaris, etc.)

For mainstream systems with a suitably well defined system call interface
to tty settings, everything works using pure Go.

For the remainder (right now means only Solaris/illumos) we use POSIX function
calls to manage termios, which implies that CGO is required on those platforms.

### Windows

Windows console mode applications are supported.  Unfortunately _mintty_
and other _cygwin_ style applications are not supported.

Modern console applications like ConEmu, as well as the Windows 10
console itself, support all the good features (resize, mouse tracking, etc.)

I haven't figured out how to cleanly resolve the dichotomy between cygwin
style termios and the Windows Console API; it seems that perhaps nobody else
has either.  If anyone has suggestions, let me know!  Really, if you're
using a Windows application, you should use the native Windows console or a
fully compatible console implementation.

### Plan9 and Native Client (Nacl)

The nacl and plan9 platforms won't work, but compilation stubs are supplied
for folks that want to include parts of this in software targetting those
platforms.  The Simulation screen works, but as Tcell doesn't know how to
allocate a real screen object on those platforms, `NewScreen()` will fail.

If anyone has wisdom about how to improve support for either of these,
please let me know.  PRs are especially welcome.

### Commercial Support

_Tcell_ is absolutely free, but if you want to obtain commercial, professional support, there are options.

[cols="2",align="center",frame="none", grid="none"]
|===
^.^|
image:logos/tidelift.png[100,100]
a|
https://tidelift.com/[Tidelift] subscriptions include support for _Tcell_, as well as many other open source packages.

^.^|
image:logos/staysail.png[100,100]
a|
mailto:info@staysail.tech[Staysail Systems, Inc.] offers direct support, and custom development around _Tcell_ on an hourly basis.

^.^|
image:logos/patreon.png[100,100]
a|I also welcome donations at https://www.patreon.com/gedamore/[Patreon], if you just want to make a contribution.
|===


Update 2017-10-02-Kisa-Kisa-2.adoc

Update 2017-10-02-Kisa-Kisa-2.adoc

= Kısa Kısa (2)
:hp-tags:

Bir süredir haftada bir yaptığım yolculuklarda farkına vardım ki her yolculuk bana ölümü ciddi anlamda hatırlatıyor. Günlük yaşantıda mezarlık duvarlarının arkasına silkelediğim(iz) bu gerçeği hatırlamama vesile oluyor yolculuklar. Her yolculuk bunu az veya çok bir şekilde yâdıma düşürüyormuş aslında yeni farkettim. Neden sorusu bu sezişin peşine takıldı hemencecik. İlk aklıma gelen cevap şu oldu: "Ölüm de bir yolculuktur neticede. Bu kısa yolculuklar o büyük yolculuğun bir musaggarasıdır." Bir de şöyle tarttım kendimi: "Yoksa geri dönememek korkusu mu bu yaşadığın?", "Ölümü de geri dönüşü olmayan bir gidiş olarak görüyorsun da Dünya'ya düşkünlüğün mü aklına getiriyor onu?" Terazinin iki kefesine iki düşünceyi de bıraktım, tahterevallide oynayan çocuklar gibi hangileri aşağıda hangileri yukarıda göremedim.

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

Bu yolculukların bitiminde kendimi bir arkadaşın kucağına bırakıverdim. Birkaç aydır uzak kaldığım, avlusunda kedilerin koşturmacasına daldığım Üsküdar Mihrimah Sultan Camiî'nden başka bir yer değildi.  Her seferinde uzaktan gül-endamını seyredip biraz özlem biraz sevinçle yol alıyorum ona doğru. Gece en siyah çarşafı örterken gökyüzüne avlusuna ayak basıyorum, Valide Sultan Camiî ile söyleşmeye başlıyor iki dost. Bölmüyorum onları, dinliyorum bir yandan şadırvandan akan suların sesi. Güneş utangaçlığını kızıllıkların ardında bırakarak gösteriyor kendini. Bir başka dostu görüyorum, uzak kalmanın ırak edemediği bir dostu. Sonra diyorum: "Dostu görmek, bayramdır."

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

Yolculuk, okul, iş derken bir yoğunluk kaplıyor dört yanımı. Yapacağım işlerin, görevlerin vs. zihnimi meşgul etmesi sanırım daha yorucu oluyor. Bu yoğunluk içerisinde bir yazıyı okumak için zaman kollamaya çalışıyordum, bir türlü nasip olmuyordu. Okuduğum zaman normalde alamayacağım bir keyfi aldım. Sanırım okumak için gösterdiğim iştiyak kitapla/yazıyla aramda bir bağ oluşmasına vesile oluyor. Aynı durum ruhen, zihnen yoğun olduğum veya kendimi yalnız hissettiğim -yıllardır tek yaşamama rağmen yalnız hissettiğim zamanlar, kalabalıklar içindeki yalnızlığımdan az- anlarda yine ortaya çıkıyor. Romanın bir kahramanı omzuma dokunuyor, bir diğeri elini uzatıyor, öbürü gülümsüyor. Buna en iyi örnek _Nisan'ın 2 Günü_, basit ve yalın bir anlatımı olsa da içinde yer bulduğum bir romandı. Birkaç yıl önce okul kütüphanesinde denk gelip ödünç almıştım. Bir kış günü sırtımı peteğe dayayıp okuduğumu hatırlıyorum. Petek siperin bir cephesi olmuştu, ayaklarımın siperin diğer cephesine değdiğini hissediyordum. Kabzası ayaklarımın ucunda bir tüfek omzuma yaslanmıştı.

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

İyi insan tanıyorum, keşke daha önce tanısaydım diyorum. Ve keşkeye öyle bir duygu ve vurgu yüklüyorum ki takat getiremiyor, eziliyor. Bir mahrû -güzel tavrı ay gibi parlıyor- bedâyi-âşinâ (bedâyi-şinas) nasıl olunur öğretiyor. Ben ne kadar öğrenebilirim bilmiyorum. Bir daha *keşke*...

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

Cevdet Paşa'nın eli omzuma dokundu.

_Nasıl çıldırmadım hayretdeyim hâlâ sevincimden_ +
_Lisânından seni sevdim sözün gûş itdiğim demler_

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

Gökte ay, parlıyor; ayın on dördüdür.

_Sana vardır yüreğimde sözlerim_

video::So6VlDiHukI[youtube]

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

Dede Efendi ne dersin böyle?

video::vvFUnXpoUSE[youtube]

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

_"Anlatıyorum, hiç konuşmadan,_ +
_Buğdayın içini dökmesi gibi..."_

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

Bir dua, Kays'ın dilinden gönlüme düşer: +
_"Gittikçe hüsnün eyle ziyâde nigârımın_ +
_Geldikçe derdine beter et müptelâ beni"_

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

-_Neden kendi cümlelerinle konuşmazsın?_ +
-Bu hâl, aklımı setr ederken ben nasıl konuşayım? +
-_Peki niye kendine sözcüler bulursun, onların diliyle söylersin?_ +
-Dilim kendi gönlümden konuşsa bu ateş yaş yaprak mı bırakır? +
-_Peki niye susmazsın?_ +
-İçim ile durmadan söyleşirken nasıl susayım? +
-_Haberdar olduğuna delilin var mıdır?_ +
-Bir ay, aydınlığının düştüğü gönülden bigâne midir? +
-_Ne vakte kadar inilersin?_ +
-Vaktin varlığından sıyrılmadan tamam olunur mu? +
-_Neyi beklersin?_ +
-Pervane, şem tutuşmadan ne yapsın? Beklediğim şeminden bir ışıktır.

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

video::asqjpUOo3YE[youtube]

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

Uyutmayan sebep, sen ne güzelsin!

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

Ya Karacaoğlan halim ortadadır, hâlâ uyandırmaz mı? +
_"Pervâne şem’ini uyandıramaz_ +
_Başta sevdâ kalpte nâr olmayınca"_

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

Ümit ve sabır, iki kardeş. Birbirlerine ne güzel sarılıyor şimdi.

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

Öyle sermestim ki ne iş ne yolculuk ne okul ne de sınavdan bir yorgunluk hissediyorum. Nasıl sermest olmayayım ki muhatap almışken bu bendeyi?

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

Üfleyiverdi yâreme şifa deyu ol mehlikâ +
Amma cûşa getirdi içre ateşi bilmedi

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

Acemice, belki hadsizce. Dilime dolanmadan kelimeler söylemek kolay değil. +
Gün doğmasın pencereme ne olur, gecemi aydınlatan ay yeter. +
_Bir nefeslik lafzımda zikrime cânan düşer_

video::244526490[vimeo]

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

Pervaneyi bir vesvese tutmuş, kaç gecedir  uyumaz beni de uyutmaz. "Söylediklerimle şemi üzer miyim?", diye kara kara düşünür. "Acaba şem pervanenin varlığından hoşnut mudur?" Teselli verdim, ikna etmeye kalkıştım. Kâr etmedi. Ne diyeyim, nasıl edeyim? +
*Pervane kendi acizliğine hatalarına bakıp vesveseye düşerdi. Şem üzülmesin; pervane tevekkül ipine sarıldı, öylece uyudu.

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

Pervanenin benden başka sırdaşı yok, kime anlatsın halini? Kime döksün içini? Akıtacak gözünden yaşları ama onların sırrını ifşa edeceğinden çekinir. Gözyaşlarını da içinde saklar.

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

Şem'i üzerlermiş, yorgun bırakırlarmış galiba. Be vefasız Pervane sen de durmaz kendi derdinden söylersin!

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

Şeyh Galib'in duasına "Amin!" deriz.

_"Yâresi muhtâc-ı kâfûr olmasın bir kimsenin_ +
_Sîneden mehpâresi dûr olmasın bir kimsenin"_

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

video::nQh3bOwTnMg[youtube]

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

En çok yolculuklar düşündürür insana, aklına gelmeyenler yakalar karanlığın ve ıssızlığın ortasında.

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

Dilimde dua:
"Hata etmekten koru, usûlsüz vusulden sana sığındık. Cahile yol göster."

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

Yazmalı mıyım sâhiden? Sanki yazamadıklarımı da gönlümden okursun. Oku ki kalksın sancısı üzerimden.

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿

Utana sıkıla, incitmekten korkarak...

video::245933662[vimeo]

✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿✿


Update 2017-10-18-Blog-Title.adoc

Update 2017-10-18-Blog-Title.adoc

// = Your Blog title
// See https://hubpress.gitbooks.io/hubpress-knowledgebase/content/ for information about the parameters.
// :hp-image: /covers/cover.png
// :published_at: 2019-01-31
// :hp-tags: HubPress, Blog, Open_Source,
// :hp-alt-title: My English Title

:hp-tags: ubPress, Blog, Open_Source

= Blog Title

:hp-image: /images/cover-image.jpg

// = Your Blog title
// See https://hubpress.gitbooks.io/hubpress-knowledgebase/content/ for information about the parameters.
// :hp-image: /covers/cover.png
// :published_at: 2019-01-31
// :hp-tags: HubPress, Blog, Open_Source,
// :hp-alt-title: My English Title

= Blog Title

:hp-image: /images/cover-image.jpg


ISIS-2258: use AsciiDoc's footnote format to provide a footnote

[[contributing]]
= Contributing
:notice: licensed to the apache software foundation (asf) under one or more contributor license agreements. see the notice file distributed with this work for additional information regarding copyright ownership. the asf licenses this file to you under the apache license, version 2.0 (the "license"); you may not use this file except in compliance with the license. you may obtain a copy of the license at. http://www.apache.org/licenses/license-2.0 . unless required by applicable law or agreed to in writing, software distributed under the license is distributed on an "as is" basis, without warranties or  conditions of any kind, either express or implied. see the license for the specific language governing permissions and limitations under the license.
include::_attributes.adoc[]
:page-partial:

This page explains how you can contribute to Apache Isis. You'll probably also want xref:toc:devguide:ide.adoc[set up your IDE] and learn xref:toc:devguide:building-apache-isis.adoc[how to build Apache Isis].

Thanks for considering to help out, your contributions are appreciated!

== Recommended Workflow (github)

Apache Isis' source code is hosted in at github (https://github.com/apache/isis.git[https], or ssh: `git@github.com:apache/isis.git`).

As you might imagine, only committers are permitted to push changes to the github repo.
As a contributor, we recommend that you fork the https://github.com/apache/isis.git[apache/isis] github repo, and then use your fork as a way of publishing your patches for the Apache Isis committers to apply.

The diagram below illustrates the process:

image::contributing/git-workflow.png[width="600px",link="{imagesdir}/contributing/git-workflow.png"]

That is:

. as a one-time activity, you fork the https://github.com/apache/isis.git[github.com/apache/isis] repo into your own fork on github.com
. as a one-time activity, you clone your fork to your local computer
. you set the https://github.com/apache/isis.git[github.com/apache/isis] as your upstream branch; this will allow you to keep your local clone up-to-date with new commits
* note the asymmetry here: the `upstream` repo (the Apache github repo) is *not* the same as the `origin` repo (your fork).
. you work on your changes locally; when done, you push them to your github fork
. to contribute back a change, raise a https://issues.apache.org/jira/browse/ISIS[JIRA] ticket, and ensure your commit message is in the form: `ISIS-nnnn: ...` so that changes can be tracked (more discussion on this point below). In any case, before you decide to start hacking with Apache Isis, it's always worth creating a ticket in JIRA and then have a discussion about it on the xref:toc:ROOT:support.adoc#[mailing lists].
. Use github to raise a https://help.github.com/articles/using-pull-requests/[pull request] for your feature
. An Apache Isis committer will review your change, and apply it if suitable.

== Setting up your fork/clone

If you choose to create your own fork then you'll need an account on https://github.com[github.com]. You then fork simply by pressing the "Fork" button:

image::contributing/github-forking.png[width="600px",link="{imagesdir}/contributing/github-forking.png"]

An account isn't needed if you just clone straight from the http://github.com/apache/isis[github.com/apache/isis].

Whether you've forked or not, you then need to clone the repo onto your computer. Github makes this very easy to do:

* for Windows users, we suggest you use github's 'Clone in Windows' feature
* for Mac/Linux users, create a clone from the command line:

Again, the info is easily found in the github page:

image::contributing/github-cloning.png[width="600px",link="{imagesdir}/contributing/github-cloning.png"]

If you've created your own fork, then you need to add the `upstream` remote to the https://github.com/apache/isis[github.com/apache/isis]. This remote is traditionally called `upstream`. You should then arrange for your `master` branch to track the `upstream/master` remote branch:

If you didn't create your own fork, you can omit the above step. Either way around, you can now fetch new commits using simply:

[source,bash]
----
git fetch
----

For more info on tracking branches http://git-scm.com/book/en/Git-Branching-Remote-Branches[here] and http://gitready.com/beginner/2009/03/09/remote-tracking-branches.html[here].

== Commit messages

Although with git your commits are always performed on your local repo, those commit messages become public when the patch is applied by an Apache Isis committer. You should take time to write a meaningful commit message that helps explain what the patch refers to; if you don't then there's a chance that your patch may be rejected and not applied. No-one likes hard work to go to waste!

We therefore recommend that your commit messages are as follows:footnote:[Inspiration for the recommended commit format comes from the https://github.com/puppetlabs/puppet[puppet] project's https://github.com/puppetlabs/puppet/blob/master/CONTRIBUTING.md[contributing] page.]

[source,other]
----
ISIS-999: Make the example in CONTRIBUTING imperative and concrete

Without this patch applied the example commit message in the CONTRIBUTING
document is not a concrete example.  This is a problem because the
contributor is left to imagine what the commit message should look like
based on a description rather than an example.  This patch fixes the
problem by making the example concrete and imperative.

The first line is a real life imperative statement with a ticket number
from our issue tracker.  The body describes the behavior without the patch,
why this is a problem, and how the patch fixes the problem when applied.
----

== Creating the patch file

If you are working without a github fork of Apache Isis, then you can create the patches from your own local git repository.

As per http://stackoverflow.com/questions/6658313/generate-a-git-patch-for-a-specific-commit[this stackoverflow question], create the patch using `git format-patch`:

[source,bash]
----
git format-patch -10 HEAD --stdout > 0001-last-10-commits.patch
----

Here `-10` is the last 10 commits you have done. You need to change that integer according to the commits you need to apply into the patch.

== Sample Contribution Workflow

Assuming you're development environment is all setup, let's walk through how you might make contribute a patch. In this example, suppose that you've decided to work on JIRA ticket #123, an enhancement to support Blob/Clob datatypes.

=== Update your master branch

The first thing to do is to make sure your local clone is up-to-date. We do this by retrieving new commits from upstream repo and then merging them as a fast-forward into your local branch.

Irrespective of whether you are using a github fork, the upstream for your local `master` branch will be tracking the appropriate remote's `master` branch. So n either case, the same commands work:

Alternatively, you can combine the `git fetch` and `git merge` and just use `git pull`:

git checkout master
git pull –ff-only

If the `merge` or `pull` fails, it means that you must have made commits and there have been changes meanwhile on the remote `master`'s branch. You can use `gitk --all` to confirm. If this fails, see our xref:_dg_git-cookbook.adoc#[git cookbook] page for a procedure to retrospectively sort out this situation.

=== Create a topic branch

We recommend you name topic branches by the JIRA ticket, ie <tt>ISIS-nnn-description</tt>. So let's create a new branch based off `master` and call it "ISIS-123-blobs"

You can confirm the branch is there and is your new `HEAD` using either `gitk --all`. Alternatively, use the command line:

[source,bash]
----
$ git checkout -b ISIS-123-blobs
----

The command line prompt should also indicate you are on a branch, isolated from any changes that might happen on the `master` branch.

=== Make File Changes and Commit

Next, make changes to your files using the usual commands (see also our xref:toc:devguide:git-cookbook.adoc[git cookbook] section):

* `git add`
* `git mv`
* `git rm`
* `git commit`
* `git status`

and so on.

Continue this way until happy with the change. Remember to run all your tests on the topic branch (including a full `mvn clean install`).

=== Rebasing with `master`

Before you can share your change, you should rebase (in other words replay) your changes on top of the `master` branch.

The first thing to do is to pull down any changes made in upstream remote's `master` since you started your topic branch:

These are the same commands that you would have run before you created your topic branch. If you use `gitk --all`, there's a good chance that new commits have come in.

Next, we reintegrate our topic branch by rebasing onto `master`:

git checkout ISIS-123-blobs
git rebase master

This takes all of the commits in your branch, and applies them on top of the new `master` branch. When your change is eventually integrated back in, it will result in a nice clear linear history on the public repo.

If the rebase fails because of a conflict, then you'll be dumped into REBASE mode. Edit the file that has the conflict, and make the appropriate edits. Once done:

Once the rebase has completed, re-run your tests to confirm that everything is still good.

=== Raising a pull request

If you have your own fork, you can now simply push the changes you've made locally to your fork:

This will create a corresponding branch in the remote github repo. If you use `gitk --all`, you'll also see a `remotes/origin/ISIS-123-blobs` branch.

Then, use github to raise a https://help.github.com/articles/using-pull-requests/[pull request]. Pull requests sent to the Apache GitHub repositories will forward a pull request e-mail to the xref:toc:ROOT:support.adoc#[dev mailing list]. You'll probably want to sign up to the dev mailing list first before issuing your first pull request (though that isn't mandatory).

The process to raise the pull request, broadly speaking:

* Open a web browser to your github fork of isis
* Select your topic branch (pushed in the previous step) so that the pull request references the topic branch.
* Click the `Pull Request` button.
* Check that the Apache Isis mailing list email came through.

== If your pull request is accepted

To double check that your pull request is accepted, update your `master` branch from the `upstream` remote:

You can then use `gitk --all` (or `git log` if you prefer the command line) to check your contribution has been added.

You can now delete your topic branch and remove the branch in your github:

Finally, you might want to push the latest changes in master back up to your github fork. If so, use:

=== If your pull request is rejected

If your pull request is rejected, then you'll need to update your branch from the main repository and then address the rejection reason.

You'll probably also want to remove the remote branch on github:

[source,bash]
----
git push origin –delete ISIS-123-blobs
----

… and continue as before until you are ready to resubmit your change.

[[contributing]]
= Contributing
:notice: licensed to the apache software foundation (asf) under one or more contributor license agreements. see the notice file distributed with this work for additional information regarding copyright ownership. the asf licenses this file to you under the apache license, version 2.0 (the "license"); you may not use this file except in compliance with the license. you may obtain a copy of the license at. http://www.apache.org/licenses/license-2.0 . unless required by applicable law or agreed to in writing, software distributed under the license is distributed on an "as is" basis, without warranties or  conditions of any kind, either express or implied. see the license for the specific language governing permissions and limitations under the license.
include::_attributes.adoc[]
:page-partial:

This page explains how you can contribute to Apache Isis. You'll probably also want xref:toc:devguide:ide.adoc[set up your IDE] and learn xref:toc:devguide:building-apache-isis.adoc[how to build Apache Isis].

Thanks for considering to help out, your contributions are appreciated!

== Recommended Workflow (github)

Apache Isis' source code is hosted in at github (https://github.com/apache/isis.git[https], or ssh: `git@github.com:apache/isis.git`).

As you might imagine, only committers are permitted to push changes to the github repo.
As a contributor, we recommend that you fork the https://github.com/apache/isis.git[apache/isis] github repo, and then use your fork as a way of publishing your patches for the Apache Isis committers to apply.

The diagram below illustrates the process:

image::contributing/git-workflow.png[width="600px",link="{imagesdir}/contributing/git-workflow.png"]

That is:

. as a one-time activity, you fork the https://github.com/apache/isis.git[github.com/apache/isis] repo into your own fork on github.com
. as a one-time activity, you clone your fork to your local computer
. you set the https://github.com/apache/isis.git[github.com/apache/isis] as your upstream branch; this will allow you to keep your local clone up-to-date with new commits
* note the asymmetry here: the `upstream` repo (the Apache github repo) is *not* the same as the `origin` repo (your fork).
. you work on your changes locally; when done, you push them to your github fork
. to contribute back a change, raise a https://issues.apache.org/jira/browse/ISIS[JIRA] ticket, and ensure your commit message is in the form: `ISIS-nnnn: ...` so that changes can be tracked (more discussion on this point below). In any case, before you decide to start hacking with Apache Isis, it's always worth creating a ticket in JIRA and then have a discussion about it on the xref:toc:ROOT:support.adoc#[mailing lists].
. Use github to raise a https://help.github.com/articles/using-pull-requests/[pull request] for your feature
. An Apache Isis committer will review your change, and apply it if suitable.

== Setting up your fork/clone

If you choose to create your own fork then you'll need an account on https://github.com[github.com]. You then fork simply by pressing the "Fork" button:

image::contributing/github-forking.png[width="600px",link="{imagesdir}/contributing/github-forking.png"]

An account isn't needed if you just clone straight from the http://github.com/apache/isis[github.com/apache/isis].

Whether you've forked or not, you then need to clone the repo onto your computer. Github makes this very easy to do:

* for Windows users, we suggest you use github's 'Clone in Windows' feature
* for Mac/Linux users, create a clone from the command line:

Again, the info is easily found in the github page:

image::contributing/github-cloning.png[width="600px",link="{imagesdir}/contributing/github-cloning.png"]

If you've created your own fork, then you need to add the `upstream` remote to the https://github.com/apache/isis[github.com/apache/isis]. This remote is traditionally called `upstream`. You should then arrange for your `master` branch to track the `upstream/master` remote branch:

If you didn't create your own fork, you can omit the above step. Either way around, you can now fetch new commits using simply:

[source,bash]
----
git fetch
----

For more info on tracking branches http://git-scm.com/book/en/Git-Branching-Remote-Branches[here] and http://gitready.com/beginner/2009/03/09/remote-tracking-branches.html[here].

== Commit messages

Although with git your commits are always performed on your local repo, those commit messages become public when the patch is applied by an Apache Isis committer. You should take time to write a meaningful commit message that helps explain what the patch refers to; if you don't then there's a chance that your patch may be rejected and not applied. No-one likes hard work to go to waste!

We therefore recommend that your commit messages are as follows [1]:

[source,other]
----
ISIS-999: Make the example in CONTRIBUTING imperative and concrete

Without this patch applied the example commit message in the CONTRIBUTING
document is not a concrete example.  This is a problem because the
contributor is left to imagine what the commit message should look like
based on a description rather than an example.  This patch fixes the
problem by making the example concrete and imperative.

The first line is a real life imperative statement with a ticket number
from our issue tracker.  The body describes the behavior without the patch,
why this is a problem, and how the patch fixes the problem when applied.
----

== Creating the patch file

If you are working without a github fork of Apache Isis, then you can create the patches from your own local git repository.

As per http://stackoverflow.com/questions/6658313/generate-a-git-patch-for-a-specific-commit[this stackoverflow question], create the patch using `git format-patch`:

[source,bash]
----
git format-patch -10 HEAD --stdout > 0001-last-10-commits.patch
----

Here `-10` is the last 10 commits you have done. You need to change that integer according to the commits you need to apply into the patch.

== Sample Contribution Workflow

Assuming you're development environment is all setup, let's walk through how you might make contribute a patch. In this example, suppose that you've decided to work on JIRA ticket #123, an enhancement to support Blob/Clob datatypes.

=== Update your master branch

The first thing to do is to make sure your local clone is up-to-date. We do this by retrieving new commits from upstream repo and then merging them as a fast-forward into your local branch.

Irrespective of whether you are using a github fork, the upstream for your local `master` branch will be tracking the appropriate remote's `master` branch. So n either case, the same commands work:

Alternatively, you can combine the `git fetch` and `git merge` and just use `git pull`:

git checkout master
git pull –ff-only

If the `merge` or `pull` fails, it means that you must have made commits and there have been changes meanwhile on the remote `master`'s branch. You can use `gitk --all` to confirm. If this fails, see our xref:_dg_git-cookbook.adoc#[git cookbook] page for a procedure to retrospectively sort out this situation.

=== Create a topic branch

We recommend you name topic branches by the JIRA ticket, ie <tt>ISIS-nnn-description</tt>. So let's create a new branch based off `master` and call it "ISIS-123-blobs"

You can confirm the branch is there and is your new `HEAD` using either `gitk --all`. Alternatively, use the command line:

[source,bash]
----
$ git checkout -b ISIS-123-blobs
----

The command line prompt should also indicate you are on a branch, isolated from any changes that might happen on the `master` branch.

=== Make File Changes and Commit

Next, make changes to your files using the usual commands (see also our xref:toc:devguide:git-cookbook.adoc[git cookbook] section):

* `git add`
* `git mv`
* `git rm`
* `git commit`
* `git status`

and so on.

Continue this way until happy with the change. Remember to run all your tests on the topic branch (including a full `mvn clean install`).

=== Rebasing with `master`

Before you can share your change, you should rebase (in other words replay) your changes on top of the `master` branch.

The first thing to do is to pull down any changes made in upstream remote's `master` since you started your topic branch:

These are the same commands that you would have run before you created your topic branch. If you use `gitk --all`, there's a good chance that new commits have come in.

Next, we reintegrate our topic branch by rebasing onto `master`:

git checkout ISIS-123-blobs
git rebase master

This takes all of the commits in your branch, and applies them on top of the new `master` branch. When your change is eventually integrated back in, it will result in a nice clear linear history on the public repo.

If the rebase fails because of a conflict, then you'll be dumped into REBASE mode. Edit the file that has the conflict, and make the appropriate edits. Once done:

Once the rebase has completed, re-run your tests to confirm that everything is still good.

=== Raising a pull request

If you have your own fork, you can now simply push the changes you've made locally to your fork:

This will create a corresponding branch in the remote github repo. If you use `gitk --all`, you'll also see a `remotes/origin/ISIS-123-blobs` branch.

Then, use github to raise a https://help.github.com/articles/using-pull-requests/[pull request]. Pull requests sent to the Apache GitHub repositories will forward a pull request e-mail to the xref:toc:ROOT:support.adoc#[dev mailing list]. You'll probably want to sign up to the dev mailing list first before issuing your first pull request (though that isn't mandatory).

The process to raise the pull request, broadly speaking:

* Open a web browser to your github fork of isis
* Select your topic branch (pushed in the previous step) so that the pull request references the topic branch.
* Click the `Pull Request` button.
* Check that the Apache Isis mailing list email came through.

== If your pull request is accepted

To double check that your pull request is accepted, update your `master` branch from the `upstream` remote:

You can then use `gitk --all` (or `git log` if you prefer the command line) to check your contribution has been added.

You can now delete your topic branch and remove the branch in your github:

Finally, you might want to push the latest changes in master back up to your github fork. If so, use:

=== If your pull request is rejected

If your pull request is rejected, then you'll need to update your branch from the main repository and then address the rejection reason.

You'll probably also want to remove the remote branch on github:

[source,bash]
----
git push origin –delete ISIS-123-blobs
----

… and continue as before until you are ready to resubmit your change.

[1] inspiration for the recommended commit format comes from the https://github.com/puppetlabs/puppet[puppet] project's https://github.com/puppetlabs/puppet/blob/master/CONTRIBUTING.md[contributing] page.


Updated browser image information to reflect Firefox image changes

== Browser Image information
=== Firefox

.Firefox Images with Selenium Server
|===
| Image | VNC Image | Selenium Version | Firefox Version | Client Version

| selenoid/firefox:3.6 | selenoid/vnc:firefox_3.6 | 2.20.0 | 3.6.16 i386 (dialogs may not work) .7+<.^|
**Java:** 2.53.1 and below
**Python:** not supported
**selenium-webdriver.js:** not supported
| selenoid/firefox:4.0 | selenoid/vnc:firefox_4.0 | 2.20.0 | 4.0.1 i386
| selenoid/firefox:5.0 | selenoid/vnc:firefox_5.0 | 2.20.0 | 5.0.1 i386
| selenoid/firefox:6.0 | selenoid/vnc:firefox_6.0 | 2.20.0 | 6.0.2 i386
| selenoid/firefox:7.0 | selenoid/vnc:firefox_7.0 | 2.20.0 | 7.0.1 i386
| selenoid/firefox:8.0 | selenoid/vnc:firefox_8.0 | 2.20.0 | 8.0.1 i386
| selenoid/firefox:9.0 | selenoid/vnc:firefox_9.0 | 2.20.0 | 9.0.1
| selenoid/firefox:10.0 | selenoid/vnc:firefox_10.0 | 2.32.0 | 10.0.2 .13+<.^|
**Java:** any modern version
**Python:** not supported
**selenium-webdriver.js:** not supported
| selenoid/firefox:11.0 | selenoid/vnc:firefox_11.0 | 2.32.0 | 11.0
| selenoid/firefox:12.0 | selenoid/vnc:firefox_12.0 | 2.32.0 | 12.0
| selenoid/firefox:13.0 | selenoid/vnc:firefox_13.0 | 2.32.0 | 13.0
| selenoid/firefox:14.0 | selenoid/vnc:firefox_14.0 | 2.32.0 | 14.0.1
| selenoid/firefox:15.0 | selenoid/vnc:firefox_15.0 | 2.32.0 | 15.0.1
| selenoid/firefox:16.0 | selenoid/vnc:firefox_16.0 | 2.32.0 | 16.0.2
| selenoid/firefox:17.0 | selenoid/vnc:firefox_17.0 | 2.32.0 | 17.0.1
| selenoid/firefox:18.0 | selenoid/vnc:firefox_18.0 | 2.32.0 | 18.0.2
| selenoid/firefox:19.0 | selenoid/vnc:firefox_19.0 | 2.32.0 | 19.0.2
| selenoid/firefox:20.0 | selenoid/vnc:firefox_20.0 | 2.32.0 | 20.0
| selenoid/firefox:21.0 | selenoid/vnc:firefox_21.0 | 2.32.0 | 21.0
| selenoid/firefox:22.0 | selenoid/vnc:firefox_22.0 | 2.32.0 | 22.0
| selenoid/firefox:23.0 | selenoid/vnc:firefox_23.0 | 2.35.0 | 23.0.1 .30+<.^| Any modern client version
| selenoid/firefox:24.0 | selenoid/vnc:firefox_24.0 | 2.39.0 | 24.0
| selenoid/firefox:25.0 | selenoid/vnc:firefox_25.0 | 2.39.0 | 25.0.1
| selenoid/firefox:26.0 | selenoid/vnc:firefox_26.0 | 2.39.0 | 26.0
| selenoid/firefox:27.0 | selenoid/vnc:firefox_27.0 | 2.40.0 | 27.0.1
| selenoid/firefox:28.0 | selenoid/vnc:firefox_28.0 | 2.41.0 | 28.0
| selenoid/firefox:29.0 | selenoid/vnc:firefox_29.0 | 2.43.1 | 29.0.1
| selenoid/firefox:30.0 | selenoid/vnc:firefox_30.0 | 2.43.1 | 30.0
| selenoid/firefox:31.0 | selenoid/vnc:firefox_31.0 | 2.44.0 | 31.0
| selenoid/firefox:32.0 | selenoid/vnc:firefox_32.0 | 2.44.0 | 32.0.3
| selenoid/firefox:33.0 | selenoid/vnc:firefox_33.0 | 2.44.0 | 33.0.3
| selenoid/firefox:34.0 | selenoid/vnc:firefox_34.0 | 2.45.0 | 34.0.5
| selenoid/firefox:35.0 | selenoid/vnc:firefox_35.0 | 2.45.0 | 35.0.1
| selenoid/firefox:36.0 | selenoid/vnc:firefox_36.0 | 2.45.0 | 36.0.1
| selenoid/firefox:37.0 | selenoid/vnc:firefox_37.0 | 2.45.0 | 37.0.2
| selenoid/firefox:38.0 | selenoid/vnc:firefox_38.0 | 2.45.0 | 38.0.5
| selenoid/firefox:39.0 | selenoid/vnc:firefox_39.0 | 2.45.0 | 39.0.3
| selenoid/firefox:40.0 | selenoid/vnc:firefox_40.0 | 2.45.0 | 40.0.3
| selenoid/firefox:41.0 | selenoid/vnc:firefox_41.0 | 2.45.0 | 41.0.2
| selenoid/firefox:42.0 | selenoid/vnc:firefox_42.0 | 2.47.1 | 42.0
| selenoid/firefox:43.0 | selenoid/vnc:firefox_43.0 | 2.53.1 | 43.0.4
| selenoid/firefox:44.0 | selenoid/vnc:firefox_44.0 | 2.53.1 | 44.0.2
| selenoid/firefox:45.0 | selenoid/vnc:firefox_45.0 | 2.53.1 | 45.0.2
| selenoid/firefox:46.0 | selenoid/vnc:firefox_46.0 | 2.53.1 | 46.0.1
| selenoid/firefox:47.0 | selenoid/vnc:firefox_47.0 | 2.53.1 | 47.0.1
| selenoid/firefox:48.0 | selenoid/vnc:firefox_48.0 | 3.2.0 + GD 0.13.0 | 48.0.2 (native events and proxies don't work)
| selenoid/firefox:49.0 | selenoid/vnc:firefox_49.0 | 3.2.0 + GD 0.13.0 | 49.0.2 (native events and switching between windows don't work)
| selenoid/firefox:50.0 | selenoid/vnc:firefox_50.0 | 3.2.0 + GD 0.13.0 | 50.0.2 (native events, switching windows and proxies don't work)
| selenoid/firefox:51.0 | selenoid/vnc:firefox_51.0 | 3.2.0 + GD 0.14.0 | 51.0.1 (native events, switching windows and proxies don't work)
| selenoid/firefox:52.0 | selenoid/vnc:firefox_52.0 | 3.3.1 + GD 0.15.0 | 52.0.2 (native events, switching windows don't work; proxy capability format could change)
|===

WARNING: Firefox images below require Selenium client 3.4.0 or newer.

.Firefox Images with Selenoid
|===
| Image | VNC Image | Selenoid Version | Geckodriver Version | Firefox Version | Client Version

| selenoid/firefox:53.0 | selenoid/vnc:firefox_53.0 | 1.3.7 | 0.16.0 | 53.0 (switching windows may not work) .4+<.^|
**Java, selenium-webdriver.js**: 3.4.0 and above
**Python**: 3.5.0 and above
| selenoid/firefox:54.0 | selenoid/vnc:firefox_54.0 | 1.3.7 | 0.17.0 | 54.0 (switching windows may not work)
| selenoid/firefox:55.0 | selenoid/vnc:firefox_55.0 | 1.3.7 | 0.18.0 | 55.0.1 (switching windows may not work)
| selenoid/firefox:56.0 | selenoid/vnc:firefox_56.0 | 1.3.7 | 0.19.0 | 56.0
|===

=== Chrome

.Chrome Images
|===
| Image | VNC Image | Chromedriver version | Chrome version

| selenoid/chrome:48.0 | selenoid/vnc:chrome_48.0 | 2.21 | 48.0.2564.116
| selenoid/chrome:49.0 | selenoid/vnc:chrome_49.0 | 2.22 | 49.0.2623.112
| selenoid/chrome:50.0 | selenoid/vnc:chrome_50.0 | 2.22 | 50.0.2661.102
| selenoid/chrome:51.0 | selenoid/vnc:chrome_51.0 | 2.23 | 51.0.2704.106
| selenoid/chrome:52.0 | selenoid/vnc:chrome_52.0 | 2.24 | 52.0.2743.116
| selenoid/chrome:53.0 | selenoid/vnc:chrome_53.0 | 2.26 | 53.0.2785.143
| selenoid/chrome:54.0 | selenoid/vnc:chrome_54.0 | 2.27 | 54.0.2840.100
| selenoid/chrome:55.0 | selenoid/vnc:chrome_55.0 | 2.28 | 55.0.2883.87
| selenoid/chrome:56.0 | selenoid/vnc:chrome_56.0 | 2.29 | 56.0.2924.87
| selenoid/chrome:57.0 | selenoid/vnc:chrome_57.0 | 2.29 | 57.0.2987.110
| selenoid/chrome:58.0 | selenoid/vnc:chrome_58.0 | 2.29 | 58.0.3029.81
| selenoid/chrome:59.0 | selenoid/vnc:chrome_59.0 | 2.30 | 59.0.3071.86
| selenoid/chrome:60.0 | selenoid/vnc:chrome_60.0 | 2.31 | 60.0.3112.90
| selenoid/chrome:61.0 | selenoid/vnc:chrome_61.0 | 2.32 | 61.0.3163.79
| selenoid/chrome:62.0 | selenoid/vnc:chrome_62.0 | 2.33 | 62.0.3202.62
|===

[NOTE]
====
. These images work with any modern Selenium client version.
. Images for older Chrome versions were not built because we have no Debian packages. If you have such packages - we could create more images.
====

=== Opera

.Opera Presto Images
|===
| Image | VNC Image | Selenium version | Opera version

| selenoid/opera:12.16 | selenoid/vnc:opera_12.16 | 2.37.0 | 12.16.1860 (dialogs and probably async JS don't work)
|===

[WARNING]
====
Due to bug in *Operadriver* to work with *Opera Blink* images you need to pass additional capability:
[source,javascript]
{"browserName": "opera", "operaOptions": {"binary": "/usr/bin/opera"}}

We do not consider these images really stable. Many of base operations like working with proxies may not work.
====

.Opera Blink Images
|===
| Image | VNC Image | Operadriver version | Opera version

| selenoid/opera:33.0 | selenoid/vnc:opera_33.0 | 0.2.2 | 33.0.1990.115
| selenoid/opera:34.0 | selenoid/vnc:opera_34.0 | 0.2.2 | 34.0.2036.50
| selenoid/opera:35.0 | selenoid/vnc:opera_35.0 | 0.2.2 | 35.0.2066.92
| selenoid/opera:36.0 | selenoid/vnc:opera_36.0 | 0.2.2 | 36.0.2130.65
| selenoid/opera:37.0 | selenoid/vnc:opera_37.0 | 0.2.2 | 37.0.2178.54
| selenoid/opera:38.0 | selenoid/vnc:opera_38.0 | 0.2.2 | 38.0.2220.41
| selenoid/opera:39.0 | selenoid/vnc:opera_39.0 | 0.2.2 | 39.0.2256.71
| selenoid/opera:40.0 | selenoid/vnc:opera_40.0 | 0.2.2 | 40.0.2308.90
| selenoid/opera:41.0 | selenoid/vnc:opera_41.0 | 2.27 | 41.0.2353.69
| selenoid/opera:42.0 | selenoid/vnc:opera_42.0 | 2.27 | 42.0.2393.94
| selenoid/opera:43.0 | selenoid/vnc:opera_43.0 | 2.27 | 43.0.2442.991
| selenoid/opera:44.0 | selenoid/vnc:opera_44.0 | 2.27 | 44.0.2510.857
| selenoid/opera:45.0 | selenoid/vnc:opera_45.0 | 2.27 | 45.0.2552.635
| selenoid/opera:46.0 | selenoid/vnc:opera_46.0 | 2.27 | 46.0.2597.26
| selenoid/opera:47.0 | selenoid/vnc:opera_47.0 | 2.29 | 47.0.2631.39
| selenoid/opera:48.0 | selenoid/vnc:opera_48.0 | 2.30 | 48.0.2685.35
|===

[NOTE]
====
. These images work with any modern Selenium client version.
. Images for older Opera versions were not built because we have no Debian packages. If you have such packages - we could create more images.
====

== Browser Image information
=== Firefox

.Firefox Images with Selenium Server
|===
| Image | VNC Image | Selenium Version | Firefox Version | Client Version

| selenoid/firefox:3.6 | selenoid/vnc:firefox_3.6 | 2.20.0 | 3.6.16 i386 (dialogs may not work) .7+<.^|
**Java:** 2.53.1 and below
**Python:** not supported
**selenium-webdriver.js:** not supported
| selenoid/firefox:4.0 | selenoid/vnc:firefox_4.0 | 2.20.0 | 4.0.1 i386
| selenoid/firefox:5.0 | selenoid/vnc:firefox_5.0 | 2.20.0 | 5.0.1 i386
| selenoid/firefox:6.0 | selenoid/vnc:firefox_6.0 | 2.20.0 | 6.0.2 i386
| selenoid/firefox:7.0 | selenoid/vnc:firefox_7.0 | 2.20.0 | 7.0.1 i386
| selenoid/firefox:8.0 | selenoid/vnc:firefox_8.0 | 2.20.0 | 8.0.1 i386
| selenoid/firefox:9.0 | selenoid/vnc:firefox_9.0 | 2.20.0 | 9.0.1
| selenoid/firefox:10.0 | selenoid/vnc:firefox_10.0 | 2.32.0 | 10.0.2 .13+<.^|
**Java:** any modern version
**Python:** not supported
**selenium-webdriver.js:** not supported
| selenoid/firefox:11.0 | selenoid/vnc:firefox_11.0 | 2.32.0 | 11.0
| selenoid/firefox:12.0 | selenoid/vnc:firefox_12.0 | 2.32.0 | 12.0
| selenoid/firefox:13.0 | selenoid/vnc:firefox_13.0 | 2.32.0 | 13.0
| selenoid/firefox:14.0 | selenoid/vnc:firefox_14.0 | 2.32.0 | 14.0.1
| selenoid/firefox:15.0 | selenoid/vnc:firefox_15.0 | 2.32.0 | 15.0.1
| selenoid/firefox:16.0 | selenoid/vnc:firefox_16.0 | 2.32.0 | 16.0.2
| selenoid/firefox:17.0 | selenoid/vnc:firefox_17.0 | 2.32.0 | 17.0.1
| selenoid/firefox:18.0 | selenoid/vnc:firefox_18.0 | 2.32.0 | 18.0.2
| selenoid/firefox:19.0 | selenoid/vnc:firefox_19.0 | 2.32.0 | 19.0.2
| selenoid/firefox:20.0 | selenoid/vnc:firefox_20.0 | 2.32.0 | 20.0
| selenoid/firefox:21.0 | selenoid/vnc:firefox_21.0 | 2.32.0 | 21.0
| selenoid/firefox:22.0 | selenoid/vnc:firefox_22.0 | 2.32.0 | 22.0
| selenoid/firefox:23.0 | selenoid/vnc:firefox_23.0 | 2.35.0 | 23.0.1 .30+<.^| Any modern client version
| selenoid/firefox:24.0 | selenoid/vnc:firefox_24.0 | 2.39.0 | 24.0
| selenoid/firefox:25.0 | selenoid/vnc:firefox_25.0 | 2.39.0 | 25.0.1
| selenoid/firefox:26.0 | selenoid/vnc:firefox_26.0 | 2.39.0 | 26.0
| selenoid/firefox:27.0 | selenoid/vnc:firefox_27.0 | 2.40.0 | 27.0.1
| selenoid/firefox:28.0 | selenoid/vnc:firefox_28.0 | 2.41.0 | 28.0
| selenoid/firefox:29.0 | selenoid/vnc:firefox_29.0 | 2.43.1 | 29.0.1
| selenoid/firefox:30.0 | selenoid/vnc:firefox_30.0 | 2.43.1 | 30.0
| selenoid/firefox:31.0 | selenoid/vnc:firefox_31.0 | 2.44.0 | 31.0
| selenoid/firefox:32.0 | selenoid/vnc:firefox_32.0 | 2.44.0 | 32.0.3
| selenoid/firefox:33.0 | selenoid/vnc:firefox_33.0 | 2.44.0 | 33.0.3
| selenoid/firefox:34.0 | selenoid/vnc:firefox_34.0 | 2.45.0 | 34.0.5
| selenoid/firefox:35.0 | selenoid/vnc:firefox_35.0 | 2.45.0 | 35.0.1
| selenoid/firefox:36.0 | selenoid/vnc:firefox_36.0 | 2.45.0 | 36.0.1
| selenoid/firefox:37.0 | selenoid/vnc:firefox_37.0 | 2.45.0 | 37.0.2
| selenoid/firefox:38.0 | selenoid/vnc:firefox_38.0 | 2.45.0 | 38.0.5
| selenoid/firefox:39.0 | selenoid/vnc:firefox_39.0 | 2.45.0 | 39.0.3
| selenoid/firefox:40.0 | selenoid/vnc:firefox_40.0 | 2.45.0 | 40.0.3
| selenoid/firefox:41.0 | selenoid/vnc:firefox_41.0 | 2.45.0 | 41.0.2
| selenoid/firefox:42.0 | selenoid/vnc:firefox_42.0 | 2.47.1 | 42.0
| selenoid/firefox:43.0 | selenoid/vnc:firefox_43.0 | 2.53.1 | 43.0.4
| selenoid/firefox:44.0 | selenoid/vnc:firefox_44.0 | 2.53.1 | 44.0.2
| selenoid/firefox:45.0 | selenoid/vnc:firefox_45.0 | 2.53.1 | 45.0.2
| selenoid/firefox:46.0 | selenoid/vnc:firefox_46.0 | 2.53.1 | 46.0.1
| selenoid/firefox:47.0 | selenoid/vnc:firefox_47.0 | 2.53.1 | 47.0.1
| selenoid/firefox:48.0 | selenoid/vnc:firefox_48.0 | 3.2.0 + GD 0.13.0 | 48.0.2 (native events and proxies don't work)
| selenoid/firefox:49.0 | selenoid/vnc:firefox_49.0 | 3.2.0 + GD 0.13.0 | 49.0.2 (native events and switching between windows don't work)
| selenoid/firefox:50.0 | selenoid/vnc:firefox_50.0 | 3.2.0 + GD 0.13.0 | 50.0.2 (native events, switching windows and proxies don't work)
| selenoid/firefox:51.0 | selenoid/vnc:firefox_51.0 | 3.2.0 + GD 0.14.0 | 51.0.1 (native events, switching windows and proxies don't work)
| selenoid/firefox:52.0 | selenoid/vnc:firefox_52.0 | 3.3.1 + GD 0.15.0 | 52.0.2 (native events, switching windows don't work; proxy capability format could change)
|===

WARNING: Firefox images below require Selenium client 3.4.0 or newer.

.Firefox Images with Selenoid
|===
| Image | VNC Image | Selenoid Version | Geckodriver Version | Firefox Version | Client Version

| selenoid/firefox:53.0 | selenoid/vnc:firefox_53.0 | 1.3.6 | 0.16.0 | 53.0 (switching windows may not work) .4+<.^|
**Java, selenium-webdriver.js**: 3.4.0 and above
**Python**: 3.5.0 and above
| selenoid/firefox:54.0 | selenoid/vnc:firefox_54.0 | 1.3.6 | 0.17.0 | 54.0 (switching windows may not work)
| selenoid/firefox:55.0 | selenoid/vnc:firefox_55.0 | 1.3.6 | 0.18.0 | 55.0.1 (switching windows may not work)
| selenoid/firefox:56.0 | selenoid/vnc:firefox_56.0 | 1.3.7 | 0.19.0 | 56.0
|===

=== Chrome

.Chrome Images
|===
| Image | VNC Image | Chromedriver version | Chrome version

| selenoid/chrome:48.0 | selenoid/vnc:chrome_48.0 | 2.21 | 48.0.2564.116
| selenoid/chrome:49.0 | selenoid/vnc:chrome_49.0 | 2.22 | 49.0.2623.112
| selenoid/chrome:50.0 | selenoid/vnc:chrome_50.0 | 2.22 | 50.0.2661.102
| selenoid/chrome:51.0 | selenoid/vnc:chrome_51.0 | 2.23 | 51.0.2704.106
| selenoid/chrome:52.0 | selenoid/vnc:chrome_52.0 | 2.24 | 52.0.2743.116
| selenoid/chrome:53.0 | selenoid/vnc:chrome_53.0 | 2.26 | 53.0.2785.143
| selenoid/chrome:54.0 | selenoid/vnc:chrome_54.0 | 2.27 | 54.0.2840.100
| selenoid/chrome:55.0 | selenoid/vnc:chrome_55.0 | 2.28 | 55.0.2883.87
| selenoid/chrome:56.0 | selenoid/vnc:chrome_56.0 | 2.29 | 56.0.2924.87
| selenoid/chrome:57.0 | selenoid/vnc:chrome_57.0 | 2.29 | 57.0.2987.110
| selenoid/chrome:58.0 | selenoid/vnc:chrome_58.0 | 2.29 | 58.0.3029.81
| selenoid/chrome:59.0 | selenoid/vnc:chrome_59.0 | 2.30 | 59.0.3071.86
| selenoid/chrome:60.0 | selenoid/vnc:chrome_60.0 | 2.31 | 60.0.3112.90
| selenoid/chrome:61.0 | selenoid/vnc:chrome_61.0 | 2.32 | 61.0.3163.79
| selenoid/chrome:62.0 | selenoid/vnc:chrome_62.0 | 2.33 | 62.0.3202.62
|===

[NOTE]
====
. These images work with any modern Selenium client version.
. Images for older Chrome versions were not built because we have no Debian packages. If you have such packages - we could create more images.
====

=== Opera

.Opera Presto Images
|===
| Image | VNC Image | Selenium version | Opera version

| selenoid/opera:12.16 | selenoid/vnc:opera_12.16 | 2.37.0 | 12.16.1860 (dialogs and probably async JS don't work)
|===

[WARNING]
====
Due to bug in *Operadriver* to work with *Opera Blink* images you need to pass additional capability:
[source,javascript]
{"browserName": "opera", "operaOptions": {"binary": "/usr/bin/opera"}}

We do not consider these images really stable. Many of base operations like working with proxies may not work.
====

.Opera Blink Images
|===
| Image | VNC Image | Operadriver version | Opera version

| selenoid/opera:33.0 | selenoid/vnc:opera_33.0 | 0.2.2 | 33.0.1990.115
| selenoid/opera:34.0 | selenoid/vnc:opera_34.0 | 0.2.2 | 34.0.2036.50
| selenoid/opera:35.0 | selenoid/vnc:opera_35.0 | 0.2.2 | 35.0.2066.92
| selenoid/opera:36.0 | selenoid/vnc:opera_36.0 | 0.2.2 | 36.0.2130.65
| selenoid/opera:37.0 | selenoid/vnc:opera_37.0 | 0.2.2 | 37.0.2178.54
| selenoid/opera:38.0 | selenoid/vnc:opera_38.0 | 0.2.2 | 38.0.2220.41
| selenoid/opera:39.0 | selenoid/vnc:opera_39.0 | 0.2.2 | 39.0.2256.71
| selenoid/opera:40.0 | selenoid/vnc:opera_40.0 | 0.2.2 | 40.0.2308.90
| selenoid/opera:41.0 | selenoid/vnc:opera_41.0 | 2.27 | 41.0.2353.69
| selenoid/opera:42.0 | selenoid/vnc:opera_42.0 | 2.27 | 42.0.2393.94
| selenoid/opera:43.0 | selenoid/vnc:opera_43.0 | 2.27 | 43.0.2442.991
| selenoid/opera:44.0 | selenoid/vnc:opera_44.0 | 2.27 | 44.0.2510.857
| selenoid/opera:45.0 | selenoid/vnc:opera_45.0 | 2.27 | 45.0.2552.635
| selenoid/opera:46.0 | selenoid/vnc:opera_46.0 | 2.27 | 46.0.2597.26
| selenoid/opera:47.0 | selenoid/vnc:opera_47.0 | 2.29 | 47.0.2631.39
| selenoid/opera:48.0 | selenoid/vnc:opera_48.0 | 2.30 | 48.0.2685.35
|===

[NOTE]
====
. These images work with any modern Selenium client version.
. Images for older Opera versions were not built because we have no Debian packages. If you have such packages - we could create more images.
====