Un restaurante muy dulce

August 29th, 2005

He encontrado la siguiente referencia a un restaurante de postres en el diario Directo al Paladar que transcribo literalmente:

En la ciudad de Barcelona existen numerosos restaurantes que tienen cierto prestigio y nos proponen una carta de vinos dulces para los postres. Entre estos restaurantes destaca Espaisucre.

Es único en el mundo. Su carta se basa esencialmente en la oferta de postres. Los menús que nos ofrecen incluyen la posibilidad de tomar de 3 a 5 postres diferentes y además acompañarlos con los mejores vinos dulces del mundo.

Jordi Butrón y Xano Saguer son los responsables de este singular restaurante-escuela, ellos se denominan “cocineros de postres”. Junto a ellos está también el sumiller Guillem Vicente, un verdadero especialista en el maridaje de postres y vinos dulces de calidad.

Más información | Espaisucre

A silent network interface is one whose main purpose is to passively monitor for traffic while not revealing or advertising its presence. By default, network interfaces in UNIX-like systems, even when configured with no IP address, could send or respond to ARP traffic, thus defeating its stealthy operation.

To prevent a network interface from sending or responding to ARP traffic, one can configure the network interface to ignore it by supplying the -arp option to ifconfig. This will put the interface into NOARP mode and, when configured with no IP address, will become stealth.

For example:

# ifconfig eth1
eth1 Link encap:Ethernet HWaddr 00:00:00:00:00:00
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Interrupt:17 Base address:0x4000
# ifconfig eth1 -arp
# ifconfig eth1
eth1 Link encap:Ethernet HWaddr 00:00:00:00:00:00
UP BROADCAST NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Interrupt:17 Base address:0x4000

In Fedora Core this can be easily achieved by adding the following line to the network interface configuration file, located in /etc/sysconfig/network-scripts:

ARP=no

For example, this line can be added to file /etc/sysconfig/network-scripts/ifcfg-eth1 so next time interface eth1 is brought up, it will be configured in NOARP mode. This can be done manually using two different commands:

  • ifconfig eth1 -arp
  • ip link set dev eth1 arp off

To re-enable ARP support:

  • ifconfig eth1 arp
  • ip link set dev eth1 arp on

SUSE Linux 10.0 Beta3 has native support for Wireless network interfaces using open authentication mode, shared-keys (like WEP), pre-shared keys (PSK) and extensible authentication (EAP).

Each network interface is configured using a plain-text file located in /etc/sysconfig/network. The configuration file usually matchs the following patterns:

  1. ifcfg-wlan-bus--
  2. ifcfg-wlan-

The first naming convention is used when SUSE Linux is unable to guess the device’s hardware MAC address, which is very common for Wireless network cards not natively supported by the Linux kernel. For example, the SMC 2835W V3 CardBus NIC only works, at the moment, using ndiswrapper, and it’s usually impossible to guess the card’s MAC address until ndiswrapper is properly configured. Also, this naming convention ties the Wireless card to an specific CardBus slot, since every slot has a different bus address.

The second naming convention is usually used for cards whose MAC address is guessable without assistance from third-party drivers or software. That is the case of my NetGear WG511U which uses an Atheros chip.

It seems SUSE 10.0 Beta3 only supports WPA (TKIP) pre-shared keys and I have bee unable to find a way to tell Yast2 to use WPA2 (AES-CCMP) authentcatio isntead. I have had to do some tweaking to SUSE’s ifup-wireless script in order to make it understand WPA-PSK with WPA2 (AES-CCMP):

--- ifup-wireless.old 2005-08-28 00:03:05.000000000 +0200
+++ ifup-wireless 2005-08-28 00:02:51.000000000 +0200
@@ -498,6 +498,16 @@
echo " psk="$L""
fi
;;
+ *psk2|*PSK2)
+ echo " key_mgmt=WPA-PSK"
+ L=$WIRELESS_WPA_PSK$SUFFIX
+ if [ ${#L} = 64 ]; then
+ echo " psk=$L"
+ else
+ echo " psk="$L""
+ fi
+ echo " proto=WPA2"
+ ;;
eap|EAP|wpa-eap|WPA-EAP)
# writing a config that tries to match everything
# FIXME: may be not optimal

This patch adds support for WPA2 authentication to /etc/sysconfig/network/scripts/ifup-wireless. In the network interface configuration file, WIRELESS_AUTH_MODE=’psk2′ must be specified in order to use WPA2 authentication protocol (instead of WIRELESS_AUTH_MODE=’psk’ which is the default value assigned by Yast2 when creating the configuration file).

A sample network configuration file:

# File /etc/sysconfig/network/ifcfg-wlan-00:11:22:33:44:55
BOOTPROTO='static'
BROADCAST=''
IPADDR='a.b.c.d
MTU=''
NAME='Accton Intersil ISL3890 [Prism GT/Prism Duette]'
NETMASK='w.x.y.z"
NETWORK=''
REMOTE_IPADDR=''
STARTMODE='hotplug'
UNIQUE='rBUF.3mb35rd_sgB'
USERCONTROL='yes'
WIRELESS_AP=''
WIRELESS_AP_SCANMODE='2'
WIRELESS_AUTH_MODE='psk2'
WIRELESS_BITRATE='auto'
WIRELESS_CA_CERT=''
WIRELESS_CHANNEL=''
WIRELESS_CLIENT_CERT=''
WIRELESS_DEFAULT_KEY='0'
WIRELESS_ESSID=' '
WIRELESS_FREQUENCY=''
WIRELESS_KEY=''
WIRELESS_KEY_0=''
WIRELESS_KEY_1=''
WIRELESS_KEY_2=''
WIRELESS_KEY_3=''
WIRELESS_KEY_LENGTH='128'
WIRELESS_MODE='Managed'
WIRELESS_NICK=''
WIRELESS_NWID=''
WIRELESS_POWER='yes'
WIRELESS_WPA_IDENTITY=''
WIRELESS_WPA_PASSWORD=''
WIRELESS_WPA_PSK='
'
_nm_name='bus-pci-0000:02:00.0'

Note the two highlighted lines:

  1. WIRELESS_AP_SCANMODE=’2′ is used to tell wpa_supplicant not to look for ESSID beacon frames used to advertise Wireless networks, and is usually used when the ESSID, for the Wireless network the interface is about to join, is hidden. Being the ESSID of the Wireless network kept hidden and this option not specified, will render wpa_supplicant unable to join the Wireless network while waiting in an infinite loop for the ESSID being broadcasted in the air.

    ifup-wireless will parse the network interface configuration file and will create a file called /var/run/wpa_supplicant- (where iface is the Linux interface name, like ath0 or wlan1) that will be feeded to wpa_supplicant itself.

  2. WIRELESS_AUTH_MODE=’psk2′ is used with the patched ifup-wireless script in otder to specifiy that WPA-PSK for WPA2 should be used (AES-CCMP) instead of plain WPA (TKIP).

    This will only work after applying the patch at the top to /etc/sysconfig/network/scrips/ifup-wireless.

I found the following link in macosxhints describing how to disable (or enable) Dashboard in Mac OS X Tiger.

Launch Terminal and then enter the following commands…

To turn Dashboard off:

defaults write com.apple.dashboard mcx-disabled -boolean YES

To turn Dashboard on:

defaults write com.apple.dashboard mcx-disabled -boolean NO

You have to restart the Dock after making either change for it to take effect:

killall Dock

I personally don’t want Bonjour (Zeroconf, mDNSResponder, Rendezvous) running all the time, because I rarely use it and because it gives away information such as your username, what services you’re running, computer name and more, depending on what you’re running. From a security perspective, you’re making it easy for an attacker to enumerate services and usernames without even having to do active scanning a lot of the time.

In order to permanently disabled the mDNSResponder daemon, run the following command:

launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist

This will unload the daemon from memory and will modify the .plist file so the service will be permanently disabled and won’t be loaded during next startup. In fact, the previous command adds the lines highlighted in bold to the “/System/Library/LaunchDaemons/com.apple.mDNSResponder.plist” file:

cat /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<true/>

<key>Label</key>
<string>com.apple.mDNSResponder</string>
<key>OnDemand</key>
<false/>
<key>ProgramArguments</key>
<array>
<string>/usr/sbin/mDNSResponder</string>
<string>-launchdaemon</string>
</array>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>

To reenable the service, simply issue:

launchctl load -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist

which will, in turn, remove the previously highlighted lines in bold from the “.plist” file.

NOTE: Disabling Bonjour breaks iTunes support for remote speakers.

How to properly set my Pinnacle PC TV Stereo PCI card under Linux.

The card I bought is based on the Phillips SAA7134 chipset which is fully supported by the Linux kernel:

lspci -v
…
02:0c.0 Multimedia controller: Philips Semiconductors SAA7134 (rev 01)
Subsystem: Pinnacle Systems Inc.: Unknown device 002b
Flags: bus master, medium devsel, latency 32, IRQ 20
Memory at e7004000 (32-bit, non-prefetchable) [size=1K]
Capabilities: [40] Power Management version 1

I had to recompile my kernel to make sure the following options are enabled in “.config”:

CONFIG_VIDEO_DEV=m
CONFIG_VIDEO_SAA7134=m

After rebooting with the new kernel, make sure “/dev/video0″ does exist, and that “/dev/video” is a symbolic link to “/dev/video0″.

Also, the following line has to be added to “/etc/X11/xorg.conf” in order to fully support video overlay coming from the tuner card:

Section "Module"

Load "v4l"
EndSection

Additionally, I added the following line to “/etc/modprobe.conf”, which is required in order to make “/dev/dsp1″ get created when the module gets loaded:

options saa7134 oss=1

Note that the Pinnacle PC TV Stereo tuner card also creates a new sound device, usually called “/dev/dsp1″ used by applications like MythTV to capture TV sound. Just make sure to tell MythTV and friends to capture sound from “/dev/dsp1″ instead of “/dev/dsp”.

It is also possible to make LIRC work with the remote IR that comes bundled with the Pinnacle PC TV Stereo simply by creating “/etc/lircd.conf” with the following lines in it:


#
# contributed by Bart Alewijnse 
#
# brand: Pinnacle Systems
# model: PCTV Remote (Perhaps other ones as well)
# supported devices: there's only one I know of. (serial)
#
# Mail me if your remote is only partly supported, or if it has different
# buttons than listed below.
#

begin remote

name PinnacleSysPCTVRemote
bits 8
eps 30
aeps 100

one 0 0
zero 0 0
gap 180000

begin codes
Mute 0x000000000000003C
Power 0x000000000000002F
Chan+Play 0x000000000000003F
Chan-Stop 0x000000000000003E
Vol+FF 0x000000000000003B
Vol-Rew 0x000000000000003D
1 0x0000000000000031
2 0x0000000000000032
3 0x0000000000000033
4 0x0000000000000034
5 0x0000000000000035
6 0x0000000000000036
7 0x0000000000000037
8 0x0000000000000038
9 0x0000000000000039
Fullscreen 0x000000000000002D
0 0x000000000000003A
Info 0x000000000000002B
Preview 0x000000000000002E
Record 0x0000000000000027
Chan_Last 0x0000000000000025
F_TV 0x0000000000000026
F_TELETEXT 0x0000000000000029
F_RADIO 0x000000000000002A

#
# here are some extra buttons a new version of the remote seems to have
#
# contributed by Robbert Monna 
#
# brand: Pinnacle Systems
# model: PCTV Remote (newest version?)
# supported devices: dongle on serial port (from TV-Card)
#
L 0x000000000000001F
Zoom 0x000000000000001E
vol+ 0x000000000000001B
vol- 0x000000000000000F
channel+ 0x0000000000000017
channel- 0x000000000000001C
middle 0x000000000000001A
Menu 0x000000000000001D
next 0x0000000000000019
undo 0x0000000000000016
pause 0x0000000000000015
redo 0x0000000000000013
Rewind 0x000000000000000E
Play 0x000000000000000D
Stop 0x000000000000000B
FForward 0x0000000000000007
EPG 0x0000000000000018

# here are some more buttons that seem to be mapped differently from
# the ones above

# contributed by InterCeptor ceptor_7@freemail.hu
#
# brand: Pinnacle Systems PCTV Pro Remote
# model no. of remote control: (I can't find any numbers on it)
# supported devices: serial
#

9 0x0000000000000082
Zoom 0x00000000000000B2
middle 0x0000000000000014

end codes
end remote

Then, make sure lircd is started at boot:

# chkconfig --level 345 lirc on
# service lircd start

And also, MythTV, when compiled with support for LIRC, can be configured to natively connect to the UNIX socket /dev/lircd that is managed by the lircd daemon by creating a file called "~/.mythtv/lircrc" with the following contents:

# lircrc.example.HauppaugeGrey-nativelirc
# 2003-09-17, Robert Kulagowski
# mailto:rkulagow@rocketmail.com
# Save this file in ~/.mythtv/lircrc

begin
prog = mythtv
button = Power
config = Esc
end

begin
prog = mythtv
button = Go
# Swap the PiP windows
config = N
end

begin
prog = mythtv
button = 1
config = 1
end

begin
prog = mythtv
button = 2
config = 2
end

begin
prog = mythtv
button = 3
config = 3
end

begin
prog = mythtv
button = 4
config = 4
end

begin
prog = mythtv
button = 5
config = 5
end

begin
prog = mythtv
button = 6
config = 6
end

begin
prog = mythtv
button = 7
config = 7
end

begin
prog = mythtv
button = 8
config = 8
end

begin
prog = mythtv
button = 9
config = 9
end

begin
prog = mythtv
button = 0
config = 0
end

begin
prog = mythtv
button = Menu
config = M
end
begin
prog = mythtv
button = undo
config = Esc
end

# Below are keys used with the Hauppauge Grey remote

#begin
# prog = mythtv
# This is the Red key
# We'll use it for "Delete"
# button = Record
# config = D
#end

#begin
# prog = mythtv
# This is the Green key
# We'll use it for "Information"
# button = Green
# config = I
#end

# Note the "repeat =" strings in the volume and channel.
# This means that if you hold down the key, every nth instance will be
# passed. This depends on your system, so you may want to increase or
# decrease this and see what happens. repeat = 1 is probably too
# fast.

begin
prog = mythtv
# Use it as a volume key
button = vol-
repeat = 3
config = F10
end

begin
prog = mythtv
button = vol+
repeat = 3
config = F11
end

begin
prog = mythtv
button = Chan+Play
repeat = 3
config = Up
end

begin
prog = mythtv
button = channel+
repeat = 3
config = Up
end

begin
prog = mythtv
button = Chan-Stop
repeat = 3
config = Down
end

begin
prog = mythtv
button = channel-
repeat = 3
config = Down
end

begin
prog = mythtv
button = Vol-Rew
# This is the "left" on the central diamond
repeat = 3
config = Left
end

begin
prog = mythtv
button = Vol+FF
# This is the "right" on the central diamond
repeat = 3
config = Right
end

begin
prog = mythtv
# Middle button on the diamond
button = middle
config = Return
end

begin
prog = mythtv
button = Mute
config = F9
end

#begin
# prog = mythtv
# Change focus for PiP (to change channel in the other window)
# button = Blank
# config = B
#end

begin
prog = mythtv
# Toggle PiP on/off
button = Fullscreen
config = V
end

#begin
# prog = mythtv
# button = Rew
# config = Left
#end

begin
prog = mythtv
button = Play
config = P
end

begin
prog = mythtv
button = FForward
config = Right
end

begin
prog = mythtv
button = Record
config = R
end

begin
prog = mythtv
# Teletext
button = Stop
config = T
end

begin
prog = mythtv
button = pause
config = P
end

#begin
# prog = mythtv
# button = Replay
# Use for backwards commercial skip
# config = Q
#end

begin
prog = mythtv
button = next
# Use for forward commercial skip
config = Z
end

This KnowledgeBase article explains how to prevent OS X from creating new .DS_Store files when opening folders on remote volumes mounted using SMB/CIFS, AFP, NFS, and WebDAV. The creation of .DS_Store files (and more so, ._AppleDouble files which are not covered in this hint) is frequently the source of complaints against Mac users, who often leave a trail of these files scattered throughout the filesystem when “visiting” a Windows computer. Even with this hint in place, the .DS_Store files will continue to be created on local volumes (which is a good thing).

To prevent the creation of these files, open the Terminal and type:

defaults write com.apple.desktopservices DSDontWriteNetworkStores true

It may be necessary to log out and back in, or even to restart the computer (which is what the article states), for the change to take effect.

Note: Most of the settings controlled by data in .DS_Store files are “cosmetic” in nature — for example, Finder window position, view style, icon position, etc. However, .DS_Store files in OS X also store Finder “comments” so in this sense, disabling .DS_Store files may result in loss of data.

He leído un interesante artículo, que trata sobre por qué el software antivirus es relativamente inútil contra nuevos especímenes y la razón de que la informática sea cada día más insegura, y que paso a traducir a continuación.

Neil Barrett se remonta a los orígenes de la informática moderna para explicar por qué el software antivirus es tan limitado y por qué es tan difícil detectar código maligno.

Algunas frases son indudablemente ciertas: yo soy un varón adulto. Otras son indudablemente falsas: puedo respirar bajo el agua. Otras, sin embargo, requieren información adicional: vivo en una casa con un baño con losetas verdes. Puedes visitar mi casa, puedes preguntar a mi familia. Es una frase resoluble o decidible, siempre y cuando sea posible obtener la información suficiente.

Sin embargo, hay frases que no son totalmente decidibles, incluso aportando información adicional, o con toda la información posible: no es posible decidir si son verdaderas o falsas. El ejemplo más conocido es la frase: “Esta frase es falsa”. Si es cierta, entonces será falsa. Si es falsa, entonces será cierta. Es gramaticalmente correcta y bien formada, pero no es posible determinar si es cierta o, por el contrario, es falsa.

Son el tipo de frases utilizadas para confundir a los niños pero que han resultado ser un anatema para los matemáticos, cuyo propósito en la vida parece ser determinar si fórmulas matemáticas bien formadas son ciertas o falsas. Si frases como “esta frase es falsa” tuvieran fórmulas matemáticas análogas, éstas no tendrían solución y, por ello, los matemáticos se habrían impuesto una tarea imposible de resolver. Este hecho empezó a cobrar importancia a principios del siglo 20, cuando matemáticos de la talla de David Hillbert y Kurt Gödel intentaron definir principios matemáticos basándose en las premisas y teorías más rigurosas. Intentaban demostrar que las matemáticas eran una ciencia exacta, completa y consistente. Desafortunadamente, lo que consiguieron fue justo lo contrario. Pero en el camino hacia dicho descubrimiento, inventaron los ordenadores, ayudaron a ganar la Segunda Guerra Mundial y construyeron los fundamentos que hoy en día constituyen la “era de la información moderna”.

El mayor responsable, más que ningún otro, de establecer estos principios fue el genial matemático Alan Turing. No sólo dió respuesta al Problema de la Resolubilidad, sino que ideó una técnica imaginativa que permite construir autómatas matemáticos, ordenadores que fueron capaces desde un principio de resolver el cifrado de la máquina Enigma, y solucionaron posteriormente problemas desde el pago de las nóminas hasta el lanzamiento de cohetes. Y lo hizo creando lo que pasó a llamarse la “Máquina de Turing”, una versión idealizada de un matemático que manipula símbolos, transformando frases en otras alternativas, llegando a obtener la respuesta a cualquier forma de cálculo que pudiera ser expresada.

Esta máquina está formada por una cinta de longitud infinita, dividida en celdas discretas, donde cada una de ellas contiene un símbolo. También contiene una unidad capaz de leer y escribir dichos símbolos sobre una celda, junto con la posición actual dentro de la cinta y el valor del símbolo a escribir, que viene determinado por un conjunto pequeño de reglas sencillas que se basan en los valores leídos. La unidad se mueve por la cinta, leyendo y alterando los símbolos, de forma que se consiga alterar el valor de la cinta correspondiente al problema “original” para obtener la “respuesta”. La máquina de Turing se detiene una vez se ha hallado la respuesta. Cualquier problema para el que la máquina consigue detenerse se dice que tiene solución o que es “decidible”, y aquellos para los cuales no se detiene se dice que son “no decidibles”. Turing demostró que existen expresiones matemáticas bien definidas para las que una máquina de Turing nunca conseguiría legar a parar, y por ello, se puede decir que son expresiones no decidibles.

La Máquina de Turing, como concepto, es tremendamente potente y ofrece a los matemáticos una forma simple y mecánica de realizar su trabajo. La Máquina de Turing, una vez construida, se convierte en un dispositivo aún más potente, convirtiéndose en un autómata matemático, un ordenador programable capaz de realizar cualquier cálculo. Quizás, el salto más importante en esta dirección lo dió John von Neumann, quien diseño una forma de construir la máquina físicamente y que ha dado forma al ordenador moderno.

En el lenguaje de las matemáticas, un programa de ordenador es una Máquina de Turing, y un ordenador – aquel dispositivo que es capaz de ejecutar una Máquina de Turing – se denomina “Máquina Universal de Turing”, un modelo matemático capaz de interpretar cualquier otro modelo matemático. Uno de los objetivos del trabajo de Turing fue demostrar que existen programas que no terminan nunca, programas que son análogos a “esta frase es falsa”, y que por ello no son decidibiles.

¿Qué significado tiene ésto para la seguridad de la información? Esencialmente, se pretende saber a priori si una secuencia dada de cambios a una serie de datos (como un programa) es dañina o no. Por desgracia, en 1986, Fred Cohen fue capaz de demostrar que el problema de determinar si un trozo de código es un virus es, realmente, un problema no decidible y que una máquina de Turing que ejecutase dicho análisis no pararía nunca. La única forma de determinar el efecto que supone ejecutar un programa, es ejecutarlo y ver qué sucede.

Esto es un resultando de una tremenda trascendencia. Significa que la labor de un software antivirus es, esencialmente, un problema matemático sin solución. Por extensión, la tarea de determinar a priori si la ejecución de un programa tendrá consecuencias nefastas es, igualmente, imposible. La única forma de determinar las consecuencias de invocar un programa es permitirle que se ejecute y observar el estado en el que queda el sistema. Por ello, el objetivo de predecir si la ejecución de un programa es nefasta, desde el punto de vista de la seguridad informática, es una tarea inalcanzable.

Esta conclusión lleva implícito el hecho de que el modelo matemático de la computación es inherentemente inseguro y que no se puede saber de antemano si algo provocará efectos dañinos o no. Tomando prestada la frase de un colega, los ordenadores son “ontológicamente inseguros”, estén construídos a partir del modelo de von Neumann o de cualquier otro.

Indudablemente, esta no es la conclusión definitiva: el software antivirus existe y realiza una función vital e importante al igual que los sistema de detección de intrusiones, los modelos de memoria segregados y otras muchas soluciones. Sin embargo, debemos ser conscientes de que cada una de estas soluciones, por sí mismas, sólo son capaces de cerrar uno de los agujeros del dique. Para conseguir una verdadera seguridad informática, es necesario utilizar algo diferente que no esté sujeto a las reglas del modelo de la Máquina de Turing. Es necesario ver el problema desde el exterior y examinarlo desde otros puntos de vista. Es necesario aplicar la perspectiva humana, del mundo real, una perspectiva fascinante que no se vea afectada por frases como “esta frase es falsa”.

Test your Nerd Score

August 19th, 2005

Take the test at http://www.nerdtests.com/ft_nq.php?im.

It’s seems I’m just a mere mortal.

Changing the background of the login window has never been so easy.

Look in folder “/Library/Desktop Pictures” for an item named “Aqua Blue.jpg”. This is the resource Mac OS X uses for the login background screen. By editing, or replacing this file, one can easily change the looking of the login window. However, it’s recommended to keep a copy of the old “Aqua Blue.jpg” in case one’s mind changes later.