Here's the place for discussion related to coding in FreeCAD, C++ or Python. Design, interfaces and structures.
wmayer
Founder
Posts: 20302 Joined: Thu Feb 19, 2009 10:32 am
Contact:
Post
by wmayer » Sat Sep 01, 2018 3:21 pm
Grawp wrote: ↑ Sat Aug 18, 2018 2:49 pm
For anyone interested in running FreeCAD with Python 3.7:
https://github.com/Grawp/FreeCAD/tree/python3.7
It is not a
proper fix yet.
PyImport_AppendInittab should be called before
Py_Initialize and I haven't had time to investigate where
Py_Initialize is being called etc.. yet so I've just added the third parameter to
_PyImport_FixupBuiltin calls.
git commit 8c08635d3 shows how to use PyImport_AppendInittab. Unfortunately, this way has two major problems:
* it can't be used for the FreeCADGui module because Py_Initialize has been called long before
* there is also an extension module FreeCAD so that it can't be loaded from a normal Python session
So, PyImport_AppendInittab is not a real solution in our case.
Last edited by
wmayer on Sat Sep 01, 2018 8:32 pm, edited 1 time in total.
Reason: Fix typo
Grawp
Posts: 45 Joined: Sat Mar 03, 2018 9:34 am
Post
by Grawp » Sat Sep 01, 2018 4:11 pm
wmayer wrote: ↑ Sat Sep 01, 2018 3:21 pm
Grawp wrote: ↑ Sat Aug 18, 2018 2:49 pm
For anyone interested in running FreeCAD with Python 3.7:
https://github.com/Grawp/FreeCAD/tree/python3.7
It is not a
proper fix yet.
PyImport_AppendInittab should be called before
Py_Initialize and I haven't had time to investigate where
Py_Initialize is being called etc.. yet so I've just added the third parameter to
_PyImport_FixupBuiltin calls.
git commit 8c08635d3 shows how to use PyImport_AppendInittab. Unfortunately, this way has two major problems:
* it can't be used for the FreeCADGui module because Py_Initialize has been called long before
* there is also an extension module FreeCAD so that itcan be loaded from a normal Python session
So, PyImport_AppendInittab is not a real solution in our case.
Well, I had already known about PyImport_AppendInittab
solution when I wrote that it wouldn't be completely trivial.. (at least that was my feeling).
I'll keep getting acquainted with FreeCAD code base so I could better understand the problem e.g. why FreeCAD* python modules have to be imported as builtins etc.. Meanwhile should I rebase my PR onto master?
wmayer
Founder
Posts: 20302 Joined: Thu Feb 19, 2009 10:32 am
Contact:
Post
by wmayer » Sat Sep 01, 2018 5:58 pm
Unfortunately, this way has two major problems:
I found a way to handle the case that the interpreter is already initialized. In this case PyImport_ImportModule returns a null pointer and then PyModule_Create can be used again and the module added directly to sys.modules. The PythonQt project does it this way and it seems to work nicely.
git commit b79e1bfee
Meanwhile should I rebase my PR onto master?
Yes, this would be great.
triplus
Veteran
Posts: 9471 Joined: Mon Dec 12, 2011 4:45 pm
Post
by triplus » Mon Sep 03, 2018 11:22 pm
kkremitzki wrote: ↑ Fri Aug 31, 2018 9:27 pm
This bug is fixed now, just gotta redo the builds for the PPA.
If i look at the fix applied by them. Without investment in gaining in-depth (Debian) packaging knowledge. It just ain't going to work. Over time i guess we can try to attract more people interested in this. But we likely should avoid undertaking such effort as properly packaging PySide2 as much as we can. And i guess becoming maintainers of the libraries FreeCAD depends on. This can quickly end up going over our heads. And instead of FreeCAD development packaging other software and maintaining some of it can quickly drain the resources available.
Jee-Bee
Veteran
Posts: 2566 Joined: Tue Jun 16, 2015 10:32 am
Location: Netherlands
Post
by Jee-Bee » Wed Sep 05, 2018 1:21 pm
Is it True that the python 3 Qt5 packages (pre compiled) aren't ready for FEM(windows)?
Both Calculix, gmsh arent included...
( i'm not sure about nedgen... i think it is included but i'm not sure!!)
looo
Veteran
Posts: 3941 Joined: Mon Nov 11, 2013 5:29 pm
Post
by looo » Wed Sep 05, 2018 2:19 pm
Jee-Bee wrote: ↑ Wed Sep 05, 2018 1:21 pm
Is it True that the python 3 Qt5 packages (pre compiled) aren't ready for FEM(windows)?
Both Calculix, gmsh arent included...
( i'm not sure about nedgen... i think it is included but i'm not sure!!)
It's not necessary to have binary-compatible gmsh and calculix. So I guess you should be able to install anything working on windows. But I think a binary compatible gmsh will (hopefully) come soon:
a first step towards this goal
netgen should be included.
easyw-fc
Veteran
Posts: 3633 Joined: Thu Jul 09, 2015 9:34 am
Post
by easyw-fc » Sat Sep 08, 2018 7:44 am
Hi,
I've started to use regularly the Py3Qt5 release to force myself in catching the incompatibilities...
I was trying to import/export a DXF file and I got this error:
Code: Select all
Traceback (most recent call last):
File "<string>", line 4, in <module>
File "D:\FreeCAD-PY36-QT5\Mod\Draft\importDXF.py", line 1920, in export
getDXFlibs()
File "D:\FreeCAD-PY36-QT5\Mod\Draft\importDXF.py", line 157, in getDXFlibs
import dxfReader
<class 'SyntaxError'>: invalid syntax (dxfReader.py, line 88)
I get the error always in exporting and only if 'legacy' importer is selected when importing.
here my FC info:
Code: Select all
OS: Windows 10
Word size of OS: 64-bit
Word size of FreeCAD: 64-bit
Version: 0.18.14570 (Git)
Build type: Release
Branch: master
Hash: 233ed49b23ee14a9978a0aa78c67396115b1582c
Python version: 3.6.6
Qt version: 5.6.2
Coin version: 4.0.0a
OCC version: 7.3.0
Locale: English/UnitedStates (en_US)
easyw-fc
Veteran
Posts: 3633 Joined: Thu Jul 09, 2015 9:34 am
Post
by easyw-fc » Tue Sep 11, 2018 2:02 pm
This PR is fixing it and it is back compatible as far as I tested.
EDIT:
OOps: there is a minor fix to apply, I'm going to PR...
PR done
sgrogan
Veteran
Posts: 6499 Joined: Wed Oct 22, 2014 5:02 pm
Post
by sgrogan » Thu Sep 13, 2018 11:35 pm
Maybe this should be in Install/Compile but it is PY3 specific.
This doesn't work for me anymore
https://forum.freecadweb.org/viewtopic. ... 90#p182647
If I set PYTHON_BASENAME CMake cannot find Pyside. If I leave it empty CMake succeeds and I can make but I get a segfault on FreeCAD start.
Code: Select all
FreeCAD 0.18, Libs: 0.18R14715 (Git)
© Juergen Riegel, Werner Mayer, Yorik van Havre 2001-2018
##### #### ### ####
# # # # # #
# ## #### #### # # # # #
#### # # # # # # # ##### # #
# # #### #### # # # # #
# # # # # # # # # ## ## ##
# # #### #### ### # # #### ## ## ##
Program received signal SIGSEGV, Segmentation fault.
#0 /lib/x86_64-linux-gnu/libc.so.6(+0x36cb0) [0x7f192beafcb0]
#1 /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0(Py_InitModule4_64+0x2b) [0x7f191f1bdeab]
#2 /usr/lib/python3/dist-packages/PySide/QtCore.cpython-34m-x86_64-linux-gnu.so(PyInit_QtCore+0x40) [0x7f1910b30320]
#3 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(_PyImport_LoadDynamicModule+0x13c) [0x7f192dae418c]
#4 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(+0x1f0323) [0x7f192dae4323]
#5 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x654b) [0x7f192daf9fbb]
#6 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalCodeEx+0x886) [0x7f192dafd976]
#7 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6742) [0x7f192dafa1b2]
#8 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalCodeEx+0x886) [0x7f192dafd976]
#9 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(+0x20a083) [0x7f192dafe083]
#10 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyObject_Call+0x68) [0x7f192da5f758]
#11 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x2c94) [0x7f192daf6704]
#12 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalCodeEx+0x886) [0x7f192dafd976]
#13 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6742) [0x7f192dafa1b2]
#14 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6c5c) [0x7f192dafa6cc]
#15 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6c5c) [0x7f192dafa6cc]
#16 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6c5c) [0x7f192dafa6cc]
#17 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalCodeEx+0x886) [0x7f192dafd976]
#18 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(+0x209fa6) [0x7f192dafdfa6]
#19 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyObject_Call+0x68) [0x7f192da5f758]
#20 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(_PyObject_CallMethodIdObjArgs+0x181) [0x7f192da2aad1]
#21 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyImport_ImportModuleLevelObject+0x763) [0x7f192dad3a43]
#22 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(+0xf594f) [0x7f192d9e994f]
#23 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x654b) [0x7f192daf9fbb]
#24 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalCodeEx+0x886) [0x7f192dafd976]
#25 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6742) [0x7f192dafa1b2]
#26 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalCodeEx+0x886) [0x7f192dafd976]
#27 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(+0x209fa6) [0x7f192dafdfa6]
#28 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyObject_Call+0x68) [0x7f192da5f758]
#29 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(_PyObject_CallMethodIdObjArgs+0x181) [0x7f192da2aad1]
#30 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyImport_ImportModuleLevelObject+0x61c) [0x7f192dad38fc]
#31 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(+0xf594f) [0x7f192d9e994f]
#32 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyObject_Call+0x68) [0x7f192da5f758]
#33 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_CallObjectWithKeywords+0x47) [0x7f192dad59b7]
#34 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x3fa1) [0x7f192daf7a11]
#35 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6c5c) [0x7f192dafa6cc]
#36 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6c5c) [0x7f192dafa6cc]
#37 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalCodeEx+0x886) [0x7f192dafd976]
#38 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalCode+0x3b) [0x7f192dafe10b]
#39 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(+0x24d6ed) [0x7f192db416ed]
#40 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x654b) [0x7f192daf9fbb]
#41 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalCodeEx+0x886) [0x7f192dafd976]
#42 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6742) [0x7f192dafa1b2]
#43 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6c5c) [0x7f192dafa6cc]
#44 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6c5c) [0x7f192dafa6cc]
#45 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6c5c) [0x7f192dafa6cc]
#46 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6c5c) [0x7f192dafa6cc]
#47 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalCodeEx+0x886) [0x7f192dafd976]
#48 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(+0x209fa6) [0x7f192dafdfa6]
#49 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyObject_Call+0x68) [0x7f192da5f758]
#50 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(_PyObject_CallMethodIdObjArgs+0x181) [0x7f192da2aad1]
#51 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyImport_ImportModuleLevelObject+0x763) [0x7f192dad3a43]
#52 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(+0xf594f) [0x7f192d9e994f]
#53 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyObject_Call+0x68) [0x7f192da5f758]
#54 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_CallObjectWithKeywords+0x47) [0x7f192dad59b7]
#55 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x3fa1) [0x7f192daf7a11]
#56 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalCodeEx+0x886) [0x7f192dafd976]
#57 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalCode+0x3b) [0x7f192dafe10b]
#58 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(+0x24d6ed) [0x7f192db416ed]
#59 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x654b) [0x7f192daf9fbb]
#60 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalCodeEx+0x886) [0x7f192dafd976]
#61 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6742) [0x7f192dafa1b2]
#62 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6c5c) [0x7f192dafa6cc]
#63 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6c5c) [0x7f192dafa6cc]
#64 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6c5c) [0x7f192dafa6cc]
#65 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6c5c) [0x7f192dafa6cc]
#66 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalCodeEx+0x886) [0x7f192dafd976]
#67 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(+0x209fa6) [0x7f192dafdfa6]
#68 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyObject_Call+0x68) [0x7f192da5f758]
#69 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(_PyObject_CallMethodIdObjArgs+0x181) [0x7f192da2aad1]
#70 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyImport_ImportModuleLevelObject+0x763) [0x7f192dad3a43]
#71 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(+0xf594f) [0x7f192d9e994f]
#72 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyObject_Call+0x68) [0x7f192da5f758]
#73 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_CallObjectWithKeywords+0x47) [0x7f192dad59b7]
#74 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x3fa1) [0x7f192daf7a11]
#75 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalCodeEx+0x886) [0x7f192dafd976]
#76 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalCode+0x3b) [0x7f192dafe10b]
#77 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(+0x24d6ed) [0x7f192db416ed]
#78 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x654b) [0x7f192daf9fbb]
#79 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalCodeEx+0x886) [0x7f192dafd976]
#80 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6742) [0x7f192dafa1b2]
#81 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6c5c) [0x7f192dafa6cc]
#82 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6c5c) [0x7f192dafa6cc]
#83 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6c5c) [0x7f192dafa6cc]
#84 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6c5c) [0x7f192dafa6cc]
#85 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalCodeEx+0x886) [0x7f192dafd976]
#86 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(+0x209fa6) [0x7f192dafdfa6]
#87 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyObject_Call+0x68) [0x7f192da5f758]
#88 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(_PyObject_CallMethodIdObjArgs+0x181) [0x7f192da2aad1]
#89 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyImport_ImportModuleLevelObject+0x763) [0x7f192dad3a43]
#90 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(+0xf594f) [0x7f192d9e994f]
#91 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyObject_Call+0x68) [0x7f192da5f758]
#92 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_CallObjectWithKeywords+0x47) [0x7f192dad59b7]
#93 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x3fa1) [0x7f192daf7a11]
#94 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalCodeEx+0x886) [0x7f192dafd976]
#95 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalCode+0x3b) [0x7f192dafe10b]
#96 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyRun_StringFlags+0x92) [0x7f192db414a2]
#97 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(+0x24d641) [0x7f192db41641]
#98 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6d79) [0x7f192dafa7e9]
#99 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x6c5c) [0x7f192dafa6cc]
#100 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalCodeEx+0x886) [0x7f192dafd976]
#101 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyEval_EvalCode+0x3b) [0x7f192dafe10b]
#102 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0(PyRun_StringFlags+0x92) [0x7f192db414a2]
#103 0x7f192e07fa02 in Base::InterpreterSingleton::runString(char const*) from /home/sgrogan/freecad-py3-build/lib/libFreeCADBase.so+0xd8
#104 0x7f192f3d7eb0 in Gui::Application::runInitGuiScript() from /home/sgrogan/freecad-py3-build/lib/libFreeCADGui.so+0x3a
#105 0x7f192f3d99eb in Gui::Application::runApplication() from /home/sgrogan/freecad-py3-build/lib/libFreeCADGui.so+0x1b27
#106 /home/sgrogan/freecad-py3-build/bin/FreeCAD(main+0x94d) [0x4076b0]
#107 /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7f192be9af45]
#108 /home/sgrogan/freecad-py3-build/bin/FreeCAD() [0x406c29]
#1 seems the problem?
Kubuntu 14.04, w/ @looos pivy package, and swig3 from Trusty backports, default QT4.
py3.png (24.42 KiB) Viewed 1883 times
Is PYTHON_CONFIG_SUFFIX the same as PYTHON_SUFFIX?
It's PY3.4 on Ubuntu 14.04 if it matters.
"fight the good fight"