Bloqueo de pantalla Comando One-Liner


62

Estoy tratando de averiguar si hay algún tipo de línea de comando equivalente que reproduzca la funcionalidad idéntica exacta de la opción de menú 'Bloquear pantalla' disponible a través de la aplicación Keychain en OS X 10.6

Conozco todas las soluciones 'habituales' (preferencias de suspensión / protector de pantalla para requerir una contraseña en la reactivación), pero estas no son adecuadas para mí.

También estoy al tanto de esta opción:

/System/Library/CoreServices/Menu\ Extras/user.menu/Contents/Resources/CGSession -suspend

que tampoco es adecuado para mí

La funcionalidad perfecta es la opción 'Bloquear pantalla', sin embargo, aún no he encontrado una forma elegante de llamarlo.

En este momento, estoy llamando a través de Automator, ¡lo cual no es elegante!

He leído mucho sobre este tema y entiendo que nadie ha encontrado aún el 'santo grial', pero me preguntaba si eso podría haber cambiado.


¿Cómo llamas a Automator?
Matthieu Riegler

3
¿Qué hay de malo en configurar las preferencias de seguridad para requerir una contraseña cuando el protector de pantalla está activo y luego usar una esquina activa para activarlo? Eso es rápido y elegante, pero dijiste que no te gustaba esa solución.
Ɱark Ƭ

3
Es una sugerencia pragmática y una que he probado durante muchos años de uso, pero la naturaleza de mis patrones de trabajo significa que esto se interpone en el 80% del tiempo. Necesito la capacidad de responder (físicamente) a solicitudes de ingeniería y emergencias e inmediatamente bloquear la pantalla, pero igualmente tengo acceso remoto a la caja mientras también mantiene todas sus conexiones existentes y tareas en segundo plano.
user40433

1
Re: "¿dónde está el menú de la pantalla de bloqueo en el llavero" Abrir llavero ... preferencias ... mostrar en la barra de menú! Re: "¿Qué hace?" ¡Bloquea la pantalla! Más allá de eso, creo que he explicado mis requisitos (y mi aversión a las 'soluciones' que algunas personas creen que cumplen mis requisitos, pero no lo hacen) completamente.
user40433

Respuestas:


50

En OS X 10.9 y posterior:

pmset displaysleepnow

Por sí solo, este comando solo hace que la pantalla se suspenda, lo que resulta en una pantalla negra. Al configurar su computadora para que requiera una contraseña inmediatamente después de dormir, esta línea única funciona como un comando "bloquear computadora". La preferencia está disponible en Preferencias del sistema> Seguridad y privacidad> General .

Fuente: ¿Cómo bloquear la pantalla en MacBook Air?


99
solo para completar, esto funciona solo si la opción de seguridad "Solicitar contraseña después de suspensión o inicio de protector de pantalla" está activada en las preferencias del sistema
Hofi

1
Esto parece más equivalente a CTRL + SHIFT + Eject.
Jan Kyu Peblik

Esto no es equivalente al elemento de la barra de menú del llavero. No bloquea la pantalla; solo pone la computadora en suspensión.
Radon Rosborough

1
@RadonRosborough No, no apaga la computadora . Pone la pantalla en suspensión. Si accede a la Mac bloqueada de forma remota, todo funciona. Esta podría ser la respuesta más corta y rápida ya que no pasa por toda la GUI lenta de Keychain o la GUI lenta del Finder.
dan

Esta es una solución mucho mejor que la antigua y mal colocada entrada de menú de Llavero 👏🏻.
dan

41

Nota: Esta solución es única en el sentido de que utiliza la funcionalidad de estado de la barra de menú de Acceso al llavero, pero no requiere que habilite la Show keychain status in menu baropción como lo hacen los métodos AppleScript.

También estaba buscando una solución para esto. Hoy tuve tiempo para jugar y encontré una manera de llamar programáticamente a la funcionalidad desde el complemento del menú de llavero. Esta solución funciona perfectamente siempre que Apple no cambie las partes relevantes en el complemento del menú de llavero. Puede crear un pequeño binario para bloquear su pantalla pegándolo en su terminal ...

# Do our work in the temporary directory that gets cleaned on boot
cd /tmp

# Create the source file
cat > main.m <<END_OF_FILE

#import <objc/runtime.h>
#import <Foundation/Foundation.h>

int main () {
    NSBundle *bundle = [NSBundle bundleWithPath:@"/Applications/Utilities/Keychain Access.app/Contents/Resources/Keychain.menu"];

    Class principalClass = [bundle principalClass];

    id instance = [[principalClass alloc] init];

    [instance performSelector:@selector(_lockScreenMenuHit:) withObject:nil];

    return 0;
}

END_OF_FILE

# Compile the source file
clang -framework Foundation main.m -o lockscreen

Ejecute el programa escribiendo:

./lockscreen

¿Podría dar más detalles sobre cómo usar esto? ¿Copio y pego esto en un flujo de trabajo de Automator? ¿O hacer un Applescript con él? Tal como está ahora, es difícil hacer algo con su respuesta.
Saaru Lindestøkke

1
Este es un programa simple de Objective-C. Cópielo en un archivo llamado main.m. Luego ejecute 'clang -framework Foundation main.m -o lockscreen' para compilar el programa. './lockscreen' ejecuta el programa y bloquea tu pantalla.
mrArkwright

Probado, funciona como se describe. La compilación genera una advertencia instance method '-_lockScreenMenuHit:' not found, pero la aplicación de pantalla de bloqueo funciona de todos modos. Sin embargo, cuando se hace doble clic, abre una ventana de Terminal antes de bloquear la pantalla. Después de desbloquear, debe cerrar la ventana manualmente. ¿Hay alguna manera de cerrar esa ventana automáticamente?
Saaru Lindestøkke

66
Recopilé una aplicación OS X: Lock Screen.app basada en esta respuesta y el trabajo de alguien como se detalla en el enlace, simplemente envuelve este código y agrega un hermoso ícono, para que podamos ejecutarlo directamente, gracias.
Mengdi Gao

1
Esto no funciona más en 10.13 porque se ha eliminado MenuExtra. Esto funciona en su lugar: stackoverflow.com/a/26492632/368409
Lloeki

15

Yo uso Alfred →

ingrese la descripción de la imagen aquí

La tecla de acceso rápido universal me permite activarla usando un teclado.


¡Increíble! ¿La tecla de acceso rápido universal está integrada o es parte del paquete de energía?
Dan Rosenstark

1
Está incorporado ...
Vaibhav Bajpai

2
Lamentablemente, este no es el caso: también cierra la conexión a Internet, mientras que el uso del bloqueo de menú Llavero no lo hace.
Marcin Bobowski

También hay un equivalente en Launchbar : "Pantalla de bloqueo"
William Turrell

Esto no es equivalente al elemento del menú Llavero. No pone la computadora en suspensión, y también reproduce una animación molesta.
Radon Rosborough

15

ACTUALIZACIÓN: 2019.

La pantalla de bloqueo para llavero ya no está disponible en la versión actual de MacOS Mojave y High Sierra.

Apple ahora ha agregado un elemento del menú de pantalla de bloqueo en el menú de Apple. Esto tiene el atajo de teclado predeterminado de crtl + cmd + Q

ingrese la descripción de la imagen aquí


------------- Respuesta anterior para el sistema operativo anterior a continuación --------------

La respuesta de @Bart Arondson entra en el uso de algunos códigos clave para navegar por el menú de la pantalla de bloqueo de llavero.

Todos los códigos clave se pueden omitir utilizando la secuencia de comandos de la GUI para acceder directamente a los elementos del menú directamente.

El uso de códigos clave para navegar por los menús puede ser impredecible. Y por mucho que no me guste la secuencia de comandos GUI porque también puede ser impredecible, en este caso es menos impredecible.

Este código de applecript: (actualizado el 18/05/2016, derivado del uso de AppleScript para bloquear la pantalla , confirmado que trabaja en El Capitan)

tell application "System Events" to tell process "SystemUIServer"
    tell (menu bar item 1 of menu bar 1 where description is "Keychain menu extra")
        click
        click menu item "Lock Screen" of menu 1
    end tell
end tell

Se puede usar en una acción Automator 'Ejecutar Applescript' en un flujo de trabajo de servicio de Automator.

ingrese la descripción de la imagen aquí

Luego le da al servicio un atajo de teclado. De la forma habitual en Los atajos de teclado.

ingrese la descripción de la imagen aquí

El servicio:

ingrese la descripción de la imagen aquí


Esto funcionó muy bien para lo que lo necesitaba, ¡gracias!
nictrix

también puedes ejecutar un comando de terminal desde el automatizador, así que lo usé parecía más "elegante" :). ¡Muy buena solución!
Sorin Buturugeanu

3
Utilicé esta solución durante mucho tiempo, pero desde osX El Captain ya no funciona :(.
Marcin Bobowski

Todavía estoy mirando esto. Pero parece que el menú no informa sobre sí mismo para hacer clic en el siguiente elemento. Ejecutar estas dos líneas funciona pero es lento. tell application "System Events" to tell process "SystemUIServer" to click (first menu bar item of menu bar 1 whose description is "Keychain menu extra") tell application "System Events" to click (menu item "Lock Screen" of menu 1 of menu bar item 1 of menu bar 1 of application process "SystemUIServer")
markhunte

8

Establezca las preferencias para bloquear la pantalla cuando el protector de pantalla esté activo.

Panel de preferencias de seguridad y privacidad

Luego puede usar este comando de terminal para iniciar el protector de pantalla.

/System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app/Contents/MacOS/ScreenSaverEngine

Por lo que puedo decir, esto es exactamente lo que hace el elemento del menú Llavero.


Gracias por tu comentario, pero esto es con lo que he luchado durante demasiado tiempo y estoy tratando de encontrar una alternativa.
user40433

1
Solo por claridad e integridad, debo decir que lo anterior realmente inicia el protector de pantalla pero no hace lo que ofrece la función de menú 'Bloquear pantalla'.
user40433

1
Entonces debe ser más específico en cuanto a lo que está buscando exactamente.
Ɱark Ƭ

Hmmm ... ¡no estoy seguro de que pueda ser más específico o sucinto que el párrafo inicial de mi pregunta original!
user40433

1
Tuve la oportunidad de probar en 10.6.8. En ese sistema operativo, el monitor se apaga y la sesión está bloqueada. He encontrado una manera programática para hacer esto, pero no está integrada.
Ɱark Ƭ

3

Creo que la respuesta a su pregunta es "No, no hay una forma de línea de comando para hacer esto".

Debido a que este es un elemento de la barra de menú, no es algo a lo que pueda acceder fácilmente usando Keyboard Maestro u otra herramienta similar.

Sin embargo, si no es reacio a una solución que utiliza una aplicación de terceros, QuickLock le permitirá hacer esto.

Es una aplicación gratuita (se aceptan donaciones) que le permitirá asignar un atajo de teclado para bloquear la pantalla. También hay un elemento de barra de menú en el que puede hacer clic para bloquear la pantalla.

La aplicación le permitirá establecer una contraseña (separada de la contraseña de su cuenta).

No requiere el uso de contraseña con protector de pantalla, todo está completamente separado.

Puedes ver un video en acción en http://www.youtube.com/watch?v=SBHwykPB19o

ps cuando la pantalla está bloqueada, escriba su contraseña para desbloquearla. Estaba confundido porque esperaba ver un campo de contraseña. No hay ninguno. Simplemente escriba la contraseña.

pps Solo lo he usado durante unos minutos, por lo que puede haber algunos otros problemas con los que no estoy al tanto, pero parece encajar.


Gracias por su contribución ... aunque no es lo que busqué (¡me encantan los métodos de código abierto y de bricolaje!) Se ve muy interesante y parece ofrecer la funcionalidad que necesito, aunque en una aplicación de terceros. Lo investigaré más de cerca. ¡Gracias!
user40433

Me encantaría encontrar una manera de hacerlo también, pero no creo que haya una.
TJ Luoma

parece muerto ...
rogerdpack

3

La Mac no está diseñada para brindarte esa opción. Sin embargo, este artículo explica una solución alternativa usando QuickSilver. Si bien no puedo entender por qué no le gusta la solución que Apple proporciona de forma nativa, le deseo suerte para encontrar una solución.


3

Una forma rápida de dormir su máquina a través de la línea de comandos con la ayuda de AppleScript es

osascript -e 'tell application "Finder" to sleep'

Eso no bloquea su pantalla a menos que la tenga configurada para requerir una contraseña de inmediato, lo cual no me gusta hacer. Solo lo estoy señalando para la posteridad.


3

Alias ​​fácil Agregue esto a su bashrc

alias afk="osascript -e 'tell application \"System Events\" to keystroke \"q\" using {command down,control down}'"

escriba afksu terminal para ejecutar.


2

Usé el código publicado anteriormente por jnk. Luego utilicé appify para convertirlo en una aplicación de OS X, mathiasbynens.be/notes/shell-script-mac-apps . Luego usé Quicksilver para asignar mi propio atajo de teclado (elegí cmd + L). El terminal no se abre / permanece abierto (como a algunos les preocupaba) con cómo lo configuré porque estoy lanzando una aplicación OS X en su lugar.

  1. Siga la respuesta anterior por jnk, Bloqueo de pantalla de comando One-Liner
  2. Use appify para convertirlo en una aplicación OS X siguiendo el enlace de arriba en mi resumen.
  3. Instalar Quicksilver.
  4. Use Quicksilver para asignar un atajo de teclado para iniciar la nueva aplicación. Está bajo 'Disparadores'. Disfruto de Quicksilver porque me encanta tener atajos de teclado / teclas de acceso rápido para iniciar aplicaciones y sitios web en OS X.

1

También me encontré con este problema. /System/Library/CoreServices/Menu\ Extras/user.menu/Contents/Resources/CGSession -suspendhace que el sistema suspenda todas las tareas, en lugar de bloquear la pantalla.

JordanBtucker estaba en el camino correcto, aquí está la función completa que uso:

lockscr() {
  if [ "$(defaults read com.apple.screensaver askForPasswordDelay 2>/dev/null)" ]; then
    local Olddelay="$(defaults read com.apple.screensaver askForPasswordDelay)"
    defaults write com.apple.screensaver askForPasswordDelay -int 0 && \
        pmset displaysleepnow
    defaults write com.apple.screensaver askForPasswordDelay -int "${Olddelay}"
  else
    defaults write com.apple.screensaver askForPasswordDelay -int 0 && \
        pmset displaysleepnow
    defaults delete com.apple.screensaver askForPasswordDelay
  fi;
}

Esto conserva al usuario su propia configuración pero bloquea de forma segura la pantalla :)


En High Sierra, la UI ya no establece estos valores. Sin embargo, si los configura manualmente, la interfaz de usuario los respetará. defaults write com.apple.screensaver askForPassword -bool TRUEy defaults write com.apple.screensaver askForPasswordDelay -int 10 Estos son mis valores predeterminados. Ahora el script anterior se comportará como se describe.
Sean Perry el

0

Utilizo BetterTouchTool para ese propósito y le asigné un atajo de teclado para "Cambiar a la pantalla de inicio de sesión" (que es la pantalla de bloqueo): no cumple con el requisito de la línea de comandos, pero puede ser útil para usted de todos modos.

atajo de teclado en BetterTouchTool para bloquear la pantalla


Gracias por su ayuda y sugerencia. Junto con QuickLock mencionado anteriormente por @TJLuoma BetterTouchTool (aunque no es el método que me propuse encontrar) parece estar muy cerca de mis objetivos funcionales. Voy a mirar más de cerca esto ... gracias.
user40433

0

No estoy seguro de entender tu problema aquí. Si necesita una contraseña en el protector de pantalla, no detendrá la ejecución de los procesos ni le impedirá acceder de forma remota a su Mac. Tengo esta opción configurada (usando ControlPlane para activarlo en el trabajo y desactivarlo en casa) y nunca he tenido una vez que el sistema se niegue a responder a una conexión de Escritorio remoto, VNC o SSH. En todos los casos donde se requiere acceso a la GUI solo necesito ingresar la contraseña; SSH utiliza un par de claves, por lo que no se solicita contraseña. Si no desea que las aplicaciones se suspendan, asegúrese de que la configuración de energía del sistema sea tal que no ingrese al sistema antes de que regrese. Simplemente configure el tiempo de espera de espera en un largo retraso. Si simplemente no desea que se le moleste ingresar una contraseña cuando está sentado frente a la computadora y trabajando,

Yo uso ctrl-shift-eject para bloquear la pantalla. Es rápido, simple y funciona. Esta es la forma integrada de bloquear la pantalla. Es probable que nadie presente una alternativa simplemente porque replicar las funciones ya integradas en el sistema operativo es demasiado redundante para que alguien pueda dedicarle mucho tiempo.

Por lo que puedo decir, de todos modos no hay una opción de "pantalla de bloqueo" en Keychain en 10.8, por lo que su solución preferida no existirá si alguna vez actualiza. Editar: no me di cuenta de esto en las preferencias de llavero; Sí, todavía está allí en 10.8.

Si está utilizando Automator para esto, ¿no puede simplemente empaquetar el script como una aplicación y asignar un combo de teclas rápidas o dejarlo en el Dock para un acceso rápido?


El ctrl-shift-eject realmente solo ingresa al modo "cambio rápido de usuario". Al menos una solución VPN (la que necesito usar para fines laborales) no me gusta, y desconecta la VPN cuando hago eso, finalizando cualquier sesión subyacente a la que me haya conectado. Si bien puedo volver a conectarme a mi sesión de VPN cuando desbloqueo la computadora, puede ser una experiencia de más de un minuto y, por lo tanto, falla la opción "rápida". Por lo tanto, esta no es, en mi opinión, una solución precisa a la pregunta.
Jon V

0

Al igual que el que hacía la pregunta, estaba buscando una manera de usar la pantalla de bloqueo de llaveros de una manera rápida.

Combinando el conocimiento de una vieja pista de Mac OS X y algunas secuencias de comandos, se me ocurrió lo siguiente:

Primero, siga los pasos de la sugerencia vinculada de Mac OS X para agregar un atajo de teclado para la funcionalidad de la pantalla de bloqueo de llaveros.

Para mí (en 10.8.4) esto no resolvió el problema, ya que tuve que presionar ctrl+ F8para cambiar el foco a la barra de estado, presionar downpara abrir la barra de menú Llavero y luego presionar ctrl+ F9para bloquear la pantalla. He automatizado este proceso con el siguiente Applescript:

# Press ^F8
tell application "System Events"
    key code 100 using control down
end tell

# Press "down"
tell application "System Events"
    key code 125
end tell

# Press ^F9
tell application "System Events"
    key code 101 using control down
end tell

Abra Automator, cree un nuevo Servicio, agregue un Run Applescriptmódulo, copie y pegue el código anterior y guarde el Servicio de Automator con el nombre que desee. Ahora vaya a Atajos de teclado en las Preferencias del sistema y agregue un atajo de teclado para el Servicio Automator recién creado. Puse el mío en ctrl+ cmd+ L.

Ahora presione el atajo de teclado en cualquier aplicación y su pantalla se bloqueará instantáneamente.

Para aquellos que se preguntan por qué no simplemente seguir con otros métodos, aquí está mi opinión sobre ellos:

  • Cambio rápido de usuario / pantalla de bloqueo
    Con este método me desconecto de mi red corporativa WPA2. Esto no es bueno ya que la reconexión a veces lleva años.

  • Salvapantallas + contraseña
    Replica la funcionalidad, pero esto significa que si mi computadora portátil está inactiva durante algún tiempo mientras leo un documento al lado, la pantalla se bloqueará cuando quiera volver a usarla. Esto no es deseable. La combinación de este método con una esquina activa tiene el efecto secundario de que los usuarios inexpertos de Mac pueden activar la esquina activa por accidente y provocar el bloqueo de pantalla. También a veces llego a una esquina caliente por accidente, lo que paralizaría considerablemente mi flujo de trabajo.

  • Aplicaciones de terceros
    Estas están bien, pero ¿por qué ejecutar una aplicación de terceros si está disponible de forma nativa en el sistema operativo?


0

En 10.14.6 Mojave, en su lugar, inicio el motor del protector de pantalla usando este comando:

/System/Library/CoreServices/ScreenSaverEngine.app/Contents/MacOS/ScreenSaverEngine


Pero no se cerró. Apreté una tecla y se abrió de nuevo. ¿Te importa si lees los comentarios de otras respuestas sobre "solicitar contraseña inmediatamente después ..." en las preferencias del sistema y actualizas la tuya en consecuencia?
Ankii

-1

Utilizo la configuración de contraseña del protector de pantalla con una pulsación de tecla (Ctrl + Shift + Eject) en 10.6.8, y por lo que puedo ver, hace lo mismo que el elemento de la pantalla de bloqueo desde el icono de la barra de tareas de acceso de llavero.

Sé que esto es similar a algunas de las otras respuestas, pero en lugar de la "esquina caliente", utiliza una pulsación de tecla, que es más conveniente para mí.

Esta solución se describe con más detalle aquí, de ahí la obtuve: http://osxdaily.com/2011/01/17/lock-screen-mac/

He estado usando esto durante varios años ahora sin problemas.


1
Gracias pero, desafortunadamente, esto requiere que la opción "requiera protector de pantalla al regresar del modo de suspensión o protector de pantalla" esté marcada y, como se mencionó anteriormente, esto no es algo que quisiera haber contratado.
user40433

-1

Bueno, solo combina dos de las respuestas anteriores. Ejecute este comando:

open -a /System/Library/Frameworks/ScreenSaver.framework//Versions/A/Resources/ScreenSaverEngine.app

Después de haber configurado las preferencias de Seguridad y Privacidad para solicitar una contraseña de inmediato. Cree un alias para su shell si desea que el comando sea más fácil de ejecutar.


3
Sí, pero, como se mencionó anteriormente, no deseo tener las preferencias de Seguridad y Privacidad para solicitar siempre una contraseña de inmediato. Esta es la razón por la cual la funcionalidad del comando Bloquear pantalla (específicamente) es tan genial: proporciona el nivel de seguridad que necesito sobre una base completamente ad hoc.
user40433

-1

FWIW, entiendo su situación y he estado buscando una buena solución para esto. Me encontré con este hilo porque he estado buscando un método algo más rápido de lo que finalmente se me ocurrió. Se me ocurrió algo que, aunque no es exactamente lo que esperaba, funciona y es un compromiso aceptable. Estoy usando el mismo tipo de comandos de secuencias de comandos GUI que muestra @markhunte (estructura ligeramente diferente, pero la misma idea) pero en lugar de colocarlo todo en un flujo de trabajo de servicio de Automator, lo separé en un paquete .app construido con Platypus. Hice esto porque en mis viajes y pruebas descubrí que los servicios de Automator funcionan muy lentamente bajo ciertas condiciones. Si su Mac está bajo algún tipo de estrés, es decir, un escaneo de disco en ejecución, software de A / V haciendo algo, correo desplegando correo electrónico, etc. el sistema operativo parece empujar los servicios al final de la línea. Esto tiene el efecto de que demore varios segundos antes de que se ejecute el flujo de trabajo (a veces) y, en ocasiones, incluso varios segundos antes de que se ejecuten los comandos de la GUI en el servicio. Bastante molesto si usted está tratando de bloquear "rápidamente" su pantalla y ¡tarda 10 segundos en hacerlo!

Tener una "aplicación" independiente también tiene la ventaja de que puedes usar literalmente docenas de diferentes aplicaciones de terceros para ejecutarla, o simplemente usar Spotlight o un servicio de Automator para iniciar la aplicación. Cualquiera de ellos funciona. Lo más rápido que he encontrado es una antigua utilidad llamada Spark, que milagrosamente funciona incluso en 10.8.4. ¡No me pregunten cómo desde la última vez que se desarrolló el enemigo 10.4! Spark se puede encontrar aquí - Spark

Además de todo esto, combatí el problema de los comandos de la GUI que a veces se ejecutan lentamente agrupando en cocoaDialog y llamándolo primero cuando la aplicación se ejecuta para mostrar una pequeña burbuja flotante en el medio de la pantalla que indica que está ocurriendo una pantalla de bloqueo. Por lo general, el bloqueo se produce justo después, pero si hay un retraso, esto al menos da una "retroalimentación" visual de que presionó las teclas correctas. También lo hice de autocuración: si "Habilitar acceso a dispositivos de asistencia" no está activado, le alerta con un cuadro de diálogo y le permite habilitarlo de inmediato. También se asegurará de que el menú de acceso al llavero se muestre en la barra de menú, ya que es un requisito o la secuencia de comandos de la GUI falla.


-2

Ctrl- Shift- ⏏ Eject(en equipos Mac más antiguos),
Ctrl- Shift- ⌽ Power(en equipos Mac más nuevos)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.