For git / iceberg first time users:
Please read the tip and tricks booklet available on http://books.pharo.org

On Tue, Nov 14, 2017 at 5:45 PM, Aliaksei Syrel <alex.sy...@gmail.com> wrote:
> Hi Offray,
>
> I understand your frustration, but with all respect, the fact that you have
> problems with Iceberg does not mean that GT Documenter or any other GT tool
> is responsible for described problems.
>
> Most complains about bloc, brick, whatever is because of unrelated stuff. It
> is a little bit disappointing. Especially for me, as one of the maintainers.
> But it is ok, I got used to it :)
>
> I don’t remember when last time I used stable Pharo (not because it does not
> exist), simply live on the edge since Pharo4. If no one will use Git and
> report problems Iceberg will never progress. If no one will use Bloc it will
> never get “there”. Unfortunately, living on the edge is dangerous, requires
> effort, motivation and time.
>
> The script that Doru provided works flawlessly on OSX, we load it almost
> everyday. !! Bloc is tested on CI and builds are green on Windows, Linux and
> OSX !!. If computer (CI) manages to install it, I am pretty sure human can
> do it too. Looks like there is something missing in your configuration,
> something tiny :) Error handling in Iceberg can be definitely improved, but
> it is a different story.
>
> P.S. Documenter can be installed without enabled Iceberg integration. This
> is how CI does it. You will just not be able to contribute.
>
> Cheers,
> Alex
>
> On Tue, 14 Nov 2017 at 16:37, Offray Vladimir Luna Cárdenas
> <offray.l...@mutabit.com> wrote:
>>
>> I have been just trying to install GT Documenter and is really frustrating
>> (I have been unable to install it even for the first time!).
>>
>> This was the list of errors I got and steps I followed, in almost
>> sequential order, just to get a (bittersweet!) taste of GT Documenter:
>>
>> 1st: LGit_GIT_ERROR: No ssh-agent suitable credentials found. So I go to
>> GitHub, follow the five pages of documentation to get my SSH credentials
>> that start at [1], then, because I still get the same error, go to the
>> Iceberg FAQ [2], try to surpass the erro,r via command line and doesn't
>> work, so I go to the Iceberg settings and try the manual configuration,
>> going to the next item
>>
>> [1]
>> https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/#generating-a-new-ssh-key
>> [2] https://github.com/pharo-vcs/iceberg/blob/master/README.md
>>
>> Now I get "Instance of LGitCredentialsSSH class did not understand
>> #ifTrue:ifFalse:". I try to make sense of it in the debugger, but is
>> something I cannot. Anyway, I rerun it and now I get: LGit_GIT_EEXISTS:
>> '/home/offray/Programas/Pharo/6.1a/Dev24/pharo-local/iceberg/feenkcom/gtoolkit'
>> exists and is not an empty directory. I delete that directory and try an
>> installation... again
>> Now I get: "Instance of FileReference did not understand #notEmpty". I try
>> to make sense of it in the debugger. My user is git, my public and private
>> ssh keys are not empty. Despite of not making sense of all I understand that
>> is trying to clone something at g...@github.com:feenkcom/gtoolkit.git. I go
>> to my image dir and then to `iceberg/feenkcom/gtoolkit/`. There is a git
>> repository there, but is empty.
>> Now I wonder, maybe if I can just clone the directory there, but how I say
>> Iceberg to load it? So I run now only the Metacello part. Same error and
>> solution that the last time but now for gtoolkit-visualizer, Brick,
>> gtoolkit-examples, Bloc and Sparta.
>> After getting my ssh keys, overcome config problems in shell and the Pharo
>> settings, chasing these errors and solving them by cloning the repositories
>> manually, I'm, a couple of hours later, ready to test GT Documenter, but
>> with the last Iceberg's duplicated repository message about Sparta I give
>> up. Is not nice to start your day accumulating frustration... that sets a
>> bad mood for the rest of it, and you need to actively fight against.
>>
>> I have thought that Git is overcomplicated for most of the developers'
>> tasks and communities. I don't know if the root of previous issues is in the
>> "Iceberg enableMetacelloIntegration: true" line, but having to get your pair
>> of keys working to just install software is overkill for the common user
>> (and when LibGit errors are present, the documented solutions don't work
>> seamlessly). Maybe a more sensitive solution would be just to use libgit,
>> without any ssh auth to clone repositories and its prerequisites or even
>> better, some download that goes to the files in the tip (or other) version
>> without all this overhead.
>>
>> Anyway, as I said, I have been unable to test GT Documenter properly and
>> getting feedback over GT Tools from the team usually requires a lot of
>> effort in my case (insisting on getting answers or getting none). And that
>> is just to test a promising tech that still doesn't offer saving features
>> (just and awesome preview). I think that a more sensible approach for a good
>> documentation toolkit for now is on Spec and creating custom syntax
>> highlighters with SmaCC[3], that is well documented and works today.
>>
>> [3]
>> https://medium.com/@juliendelplanque/hacking-a-simple-syntactic-highlighter-around-specs-textmodel-44ba2e2b1ab9
>>
>> I understand that community is trying its best, but expressing how current
>> offerings are not mature and constructive criticism can help on that. At the
>> moment my feeling is that if you want to try the new shinny alpha stuff from
>> GT Documenter, you will need to be prepared for a lot of frustration and
>> silence.
>>
>> Cheers,
>>
>> Offray
>>
>>
>> On 10/11/17 12:41, Tudor Girba wrote:
>>
>> Hi,
>>
>> As shown at ESUG, GT Documenter offers an advanced viewer (and editor) for
>> Pillar working on top of Bloc.
>>
>> You can get it by loading:
>>
>> Iceberg enableMetacelloIntegration: true.
>> Metacello new
>>    baseline: 'GToolkit';
>>    repository: 'github://feenkcom/gtoolkit/src';
>>    load.
>>
>> For example, you can then inspect:
>> 'PATH_TO_ICEBERG/feenkcom/gtoolkit/doc/transcript/index.pillar’
>> asFileReference
>>
>> Cheers,
>> Doru
>>
>>
>> On Nov 10, 2017, at 12:58 PM, H. Hirzel <hannes.hir...@gmail.com> wrote:
>>
>> A note:
>>
>> Tudor Girba wrote:
>> <tu...@tudorgirba.com>       Fri, Aug 25, 2017 at 1:31 PM
>> Reply-To: Any question about pharo is welcome
>> <pharo-users@lists.pharo.org>
>> To: Any question about pharo is welcome <pharo-users@lists.pharo.org>
>>
>> Hi,
>>
>> As mentioned in an announcement about 10 days ago, we are building a
>> Pillar editor with inline viewing abilities in Bloc. Here is how it
>> looked like. Please note the embedded picture. We continued working on
>> it since then and we will probably announce the next version this
>> weekend:
>>
>>
>> Maybe there is now enough progress to do simple presentations in Bloc?
>>
>>
>> On 11/10/17, H. Hirzel <hannes.hir...@gmail.com> wrote:
>>
>> Hello
>>
>> In the thread 'including Pillar in Pharo image by default' it was
>> suggested by Stephane Ducasse to include a subset of Pillar in the
>> Pharo image[1] .
>>
>> I'd like to extend that proposal a little bit it in order  to do very
>> simple presentations. This should allow to describe at least part of
>> the slides used in the MOOC course [3].
>>
>> This will be  _a possible_ solution to the question  brought up in the
>> thread 'Writing "powerpoint" like presentations in Pharo?'.
>>
>> Another use is to write instructions with executable content within
>> the image ("Assistants").
>>
>> So below is the a proposal for a Pillar syntax _subset_ for class
>> comments and _simple_ presentations.
>> The numbering scheme follows the 'Pillar syntax cheat sheet' [2]
>>
>>
>>
>>
>> MINI PILLAR SYNTAX (a subset of Pillar)
>>
>> 1. Headers
>>
>>    !Header 1
>>    !!Header 2
>>    !!!Header 3
>>
>>
>> 2. Lists
>>
>>    - Unordered List
>>    # Ordered list
>>
>>
>>
>> 5. Emphasis
>>
>>    ""bold""
>>
>>
>> 6. Code blocks
>>
>>     [[[
>>     Transcript show: 'Hello World'.
>>     \]]]
>>
>>
>> 9. Annotation
>>
>> ${slide:title=About Pharo}$
>>
>>
>>
>>
>> Next week I plan to implement the rendering of this 'Mini Pillar' in
>> Morphic using the Morphic API subset that works in Pharo and Squeak.
>>
>> A renderer using Bloc would also be nice. [4]
>>
>> Comments, suggestions, code snippets and other help is welcome.
>>
>> Regards
>> Hannes
>>
>>
>>
>>
>>
>> --------------------------------------------------------------------------------------------------
>> [1] Pillar subset for class comments
>>
>> Stephane Ducasse
>> <stepharo.s...@gmail.com>    Fri, Aug 11, 2017 at 7:09 PM
>> To: Any question about pharo is welcome <pharo-users@lists.pharo.org>
>>
>> Tx cyril
>>
>> For class comment I image that we want
>>
>> !
>>
>> -
>> -
>> *url*
>> and bold
>> [[[
>>
>> ]]]
>>
>> Did I miss something.
>>
>> Stef
>>
>>
>>
>>
>>
>>
>> --------------------------------------------------------------------------------------------------
>> [2]
>> http://pillarhub.pharocloud.com/hub/pillarhub/pillarcheatsheet
>>
>> --------------------------------------------------------------------------------------------------
>>
>>
>> 1. Headers
>>
>>    !Header 1
>>    !!Header 2
>>    !!!Header 3
>>    !!!!Header 4
>>    !!!!!Header 5
>>    !!!!!!Header 6
>>
>> 2. Lists
>>
>>    - Unordered List
>>    # Ordered list
>>
>> 3. Table
>>
>>    |! Left |! Right |! Centered
>>    |{Left |}Right| Centered
>>
>>
>> 4. Description
>> Note
>> on a new line
>>
>>    ;head
>>    :item
>>
>>
>> 5. Emphasis
>>
>>    ""bold""
>>    ''italic''
>>    --strikethrough--
>>    __underscore__
>>    ==inline code==
>>    @@subscript@@
>>    ^^sub-script^^
>>
>> 6. Code blocks
>>
>>     [[[lab­el=­hel­loS­cri­pt|­cap­tio­n=How to print Hello
>> World|­lan­gua­ge=­Sma­lltalk
>>     Transcript show: 'Hello World'.
>>     \]]]
>>
>>
>> 7. Raw
>>
>>
>>    {{{latex:
>>    this is how you inject raw \LaTeX in your output file
>>    }}}
>>
>>    {{{mar­kdown:
>>    this is how you inject raw `markdown` in your output file
>>    }}}
>>
>>    {{{html:
>>    this is how you inject raw <b>­htm­l</­b> in your output file
>>    }}}
>>
>>
>> 8. Links
>>
>>    Anchor @anchor (new line)
>>    Internal link *anchor*
>>    External link *Google>http://google.com*
>>    Image +Caption>file://image.png|width=50|label=label+
>>
>>
>> 9. Annotation
>> Note
>> on a new line
>>
>>    Annotation @@note this is a note
>>    Todo item @@todo this is to do
>>
>>
>> 10. Comments
>>
>>    % each line starting with % is commented
>>
>>
>> 11. References
>>
>> This document is copied from
>> http://www.cheatography.com/benjaminvanryseghem/cheat-sheets/pillar/
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> ----------------------------------------------------------------------
>> [3] Example pillar code for slides
>> ----------------------------------------------------------------------
>>
>>
>> https://github.com/SquareBracketAssociates/PharoMooc/blob/master/Slides/1-Templates/SlideExample.pillar
>>
>> {
>>      "title":"To the Roots of Objects",
>>      "subtitle":"Learning from beauty",
>>      "author":"Stephane Ducasse",
>>      "complement":"http://stephane.ducasse.free.fr/ \\\\
>> stephane.duca...@inria.fr"
>> }
>>
>>
>> ${toc:depthLevel=2|level=0|highlight=0}$
>>
>> %Les sections ne sont pas des titres de slide mais définnissent la
>> structure du doucment. Il est possible de rajouter
>> "renderStructureAsSlide":false dans pillar.conf pour ne pas créer de
>> slide à partir d'un titre.
>>
>>
>> ${slide:title=License}$
>>
>> +>file://figures/CreativeCommons.png|width=50|label=figCreativeCommons+
>>
>>
>> ! Introduction
>>
>> %
>> ${toc:depthLevel=1|level=0|highlight=1}$
>>
>>
>> ${slide:title=Really?!|label=really}$
>>
>> ${columns}$
>>
>> ${column:width=50}$
>>
>> %the width parameter take an Int between 1 and 100
>> %For now we have to pass a line before and after an annotation, I'll
>> correct that soon in Pillar.
>> - No primitive types
>> - No hardcoded constructs for conditional
>> - Only messages
>> - Only objects
>>
>> ${column:width=50}$
>>
>> - and this works?
>> - I mean really?
>> - Not even slow?
>> - Can't be real!
>>
>> ${endColumns}$
>>
>> ${slide:title=Motto}$
>>
>> - Let's open our eyes, look, understand, and deeply understand the
>> underlying design aspects of object-oriented programming.
>>
>>
>> *@really*
>>
>> *TEST !>@really*
>>
>> ${slide:title=Booleans}$
>>
>> [[[language=smalltalk
>> 3 > 0
>>      ifTrue: ['positive']
>>      ifFalse: ['negative']
>> -> 'positive'
>> ]]]
>>
>> ${slide:title=Yes ifTrue\:ifFalse\: is a message!}$
>>
>> [[[language=smalltalk
>> Weather isRaining
>>      ifTrue: [self takeMyUmbrella]
>>      ifFalse: [self takeMySunglasses]
>> ]]]
>>
>> - Conceptually ==ifTrue:ifFalse:== is a message sent to an object: a
>> boolean!
>> - ==ifTrue:ifFalse:== is in fact radically optimized by the compiler
>> but you can implement another one such ==siAlors:sinon:== and check.
>>
>> ${slide:title=Booleans}$
>>
>> In Pharo booleans have nothing special
>> - & | not
>> - or: and: (lazy)
>> - xor:
>> - ifTrue:ifFalse:
>> - ifFalse:ifTrue:
>> - ...
>>
>> ${slide:title=Lazy Logical Operators}$
>>
>>      *LINK>@frm:really*
>>
>> [[[language=smalltalk
>>      false and: [1 error: 'crazy']
>> -> false and not an error
>> ]]]
>>
>> ! Exercices
>> ${toc:depthLevel=1|level=0|highlight=1}$
>>
>> !! Exercise 1: Implement not
>>
>> ${slide:title=Exercise 1\: Implement not}$
>>
>> - Propose an implementation of not in a world where you do not have
>> Booleans.
>> - You only have objects and messages.
>> [[[language=smalltalk
>> false not
>>      -> true
>>
>> true not
>>      -> false
>> ]]]
>>
>> !!Exercise 2: Implement | (Or) ifTrue: ifFalse:
>>
>> ${toc:depthLevel=2|level=0|highlight=1}$
>>
>> ${slide:title=Exercise 2\: Implement \| (Or)}$
>>
>> - Propose an implementation of or in a world where you do not have
>> Booleans.
>> - You only have objects and messages.
>>
>> [[[language=smalltalk
>>      true | true -> true
>>      true | false -> true
>>      true | anything -> true
>>
>>      false | true -> true
>>      false | false -> false
>>      false | anything -> anything
>> ]]]
>>
>> ${slide:title=Exercise2\: Variation - Implement ifTrue\:ifFalse\:}$
>>
>> - Propose an implementation of not in a world where you do not have
>> Booleans.
>> - You only have objects, messages and closures.
>>
>> [[[language=smalltalk
>> false ifTrue: [ 3 ] ifFalse: [ 5 ]
>> -> 5
>> true ifTrue: [ 3 ] ifFalse: [ 5 ]
>> -> 3
>> ]]]
>>
>> ! Boolean Implementation
>>
>> ${toc:depthLevel=1|level=0|highlight=1}$
>>
>> ${slide:title=Booleans Implementation Hint One}$
>>
>> - The solution does not use conditionals
>> - else we would obtain a recursive definition of ==ifTrue:ifFalse:==
>>
>> ${slide:title=Boolean Implementation Hint Two}$
>>
>> - The solution uses three classes: ==Boolean==, ==True== and ==False==
>> - ==false== and ==true== are unique instances described by their own
>> classes
>> - ==false== is an instance of the class ==False==
>> - ==true== is an instance of the class ==True==
>>
>> +Boolean
>> Hierarchy>file://figures/BooleanHiearchyAndInstances.png|width=50+
>>
>> ${slide:title=How do we express choice in OOP?}$
>>
>> - We send messages to objects
>>
>> [[[language=smalltalk
>>      aButton color
>>      -> Color red
>>      
>>      aPane color
>>      -> Color blue
>>      
>>      aWindow color
>>      -> Color grey
>> ]]]
>>
>> - Let's the receiver decide
>>
>> - Do not ask, tell
>>
>> ${slide:title=Boolean not implementation}$
>>
>> - Class ==Boolean== is an abstract class that implements behavior
>> common to true and false. Its subclasses are ==True== and ==False==.
>> Subclasses must implement methods for logical operations ==&==,
>> ==not==, and controls ==and:==, ==or:==, ==ifTrue:==, ==ifFalse:==,
>> ==ifTrue:ifFalse:==, ==ifFalse:ifTrue:==
>>
>> [[[language=smalltalk
>> Boolean>>not
>>      "Negation. Answer true if the receiver is false, answer false if the
>> receiver is true."
>>      self subclassResponsibility
>> ]]]
>>
>> ${slide:title=Not implementation in two methods}$
>>
>> [[[language=smalltalk
>> False>>not
>>      "Negation -- answer true since the receiver is false."
>>      ^ true
>> ]]]
>>
>> [[[language=smalltalk
>> True>>not
>>      "Negation--answer false since the receiver is true."
>>      ^ false
>> ]]]
>>
>> ${slide:title=Not implementation in two methods}$
>>
>> +Not
>>
>> implementation.>file://figures/BooleanHiearchyAndInstancesWithNotMethods.png|width=80+
>>
>> ${slide:title=\| (Or)}$
>> [[[language=smalltalk
>>      
>>      true | true -> true
>>      true | false -> true
>>      true | anything -> true
>>
>>      false | true -> true
>>      false | false -> false
>>      false | anything -> anything
>>
>> ]]]
>>
>> ${slide:title=Boolean>> \| aBoolean}$
>>
>> [[[language=smalltalk
>>      Boolean>> | aBoolean
>>              "Evaluating disjunction (OR). Evaluate the argument. Answer 
>> true if
>> either the receiver or the argument is
>> true."
>>      self subclassResponsibility
>> ]]]
>>
>> ${slide:title=False>> \| aBoolean}$
>>
>> [[[language=smalltalk
>> false | true -> true
>> false | false -> false
>> false | anything -> anything
>> ]]]
>>
>> [[[language=smalltalk
>> False >> | aBoolean
>>      "Evaluating disjunction (OR) -- answer with the argument, aBoolean."
>>      ^ aBoolean
>> ]]]
>>
>> ${slide:title=True>> \| aBoolean}$
>>
>> [[[language=smalltalk
>> true | true -> true
>> true | false -> true
>> true | anything -> true
>> ]]]
>>
>> [[[language=smalltalk
>> True>> | aBoolean
>>      "Evaluating disjunction (OR) -- answer true since the receiver is true."
>>      ^ self
>> ]]]  
>>
>> ${slide:title=Or implementation in two methods}$
>>
>> +>file://figures/BooleanHiearchyAndInstancesWithOrMethods.png|width=80+
>>
>> ${slide:title=Implementing ifTrue\:ifFalse\:}$
>>
>> - Do you see the pattern?
>> - Remember that a closure freezes execution and that value launches
>> the execution of a frozen code.
>>
>> [[[language=smalltalk
>> True>>ifTrue: aTrueBlock ifFalse: aFalseBlock
>>      ^ aTrueBlock value
>> ]]]
>>
>> [[[language=smalltalk
>> False>>ifTrue: aTrueBlock ifFalse: aFalseBlock
>>      ^ aFalseBlock value
>> ]]]
>>
>> ${slide:title=Implementation Note}$
>>
>> - Note that the Virtual Machine shortcuts calls to boolean such as
>> condition for speed reason.
>> - But you can implement your own conditional method and debug to see
>> that sending a message is dispatching to the right object.
>>
>> ! So what ?
>>
>> ${toc:depthLevel=1|level=0|highlight=1}$
>>
>> ${slide:title=Ok so what?}$
>>
>> - You will probably not implement another Boolean classes
>> - So is it really that totally useless?
>>
>>
>> ${slide:title=Message sends act as case statements}$
>>
>> - The execution engine will select the right method in the class of the
>> receiver
>> - The case statements is dynamic in the sense that it depends on the
>> classes loaded and the objects to which the message is sent.
>> - Each time you send a message, the system will select the method
>> corresponding to the receiver.
>>
>>
>> ${slide:title=A Class Hierarchy is a Skeleton for Dynamic Dispatch}$
>>
>> - If we would have said that the ==Boolean== would be composed of only
>> one class, we could not have use dynamic binding.
>> - A class hierarchy is the exoskeleton for dynamic binding
>>
>> - Compare the solution with one class vs. a hierarchy.
>>
>> +One single class vs. a nice
>> hierarchy.>file://figures/Design-FatVsDispatch.png|width=70+
>>
>> - The hierarchy provides a way to specialize behavior.
>> - It is also more declarative in the sense that you only focus on one
>> class.
>> - It is more modular in the sense that you can package different
>> classes in different packages.
>>
>> ${slide:title=Avoid Conditionals}$
>>
>> - Use objects and messages, when you can
>> - The execution engine acts as a conditional switch: Use it!
>> - Check the AntiIfCampaign.
>>
>> ${slide:title=Follow-up: Implement ternary logic}$
>>
>> - Boolean: ==true==, ==false==, ==unknown==
>> +Ternaru Logic decision table
>>
>> file://figures/ArrayBoolean.png|width=30|label=fig:ternLogic+
>>
>> - Implementing in your own classes.
>>
>> ! Summary
>>
>> ${toc:depthLevel=1|level=0|highlight=1}$
>>
>> ${slide:title=Summary}$
>> - Tell, do not ask
>> - Let the receiver decide
>> - Message sends as potential dynamic conditional
>> - Class hiearchy builds a skeleton for dynamic dispatch
>> - Avoid conditional
>>
>>
>>
>>
>> -----------------------------------------
>> [4] Bloc
>> Load Bloc with executing in a playground (Pharo 6.1)
>>
>>    Metacello new
>>    baseline: 'Bloc';
>>    repository: 'github://pharo-graphics/Bloc:pharo6.1/src';
>>    load: #core
>>
>>
>> A tutorial to use bloc is available on
>> http://files.pharo.org/books/
>> Bloc Memory Game (alpha) is a first tutorial on Bloc the new graphics
>> core for Pharo. Booklet written by A. Chis, S. Ducasse, A. Syrel.
>>
>> http://files.pharo.org/books-pdfs/booklet-Bloc/2017-11-09-memorygame.pdf
>>
>> To load the memory game
>>
>>    Metacello new
>>    baseline: 'BlocTutorials';
>>    repository: 'github://pharo-graphics/Tutorials/src';
>>    load
>>
>>
>> A similar booklet could be done for the title
>> 'Doing a presentation / slide show / assitant with Bloc' (or similar,
>> adapt  .....)
>>
>> --
>> www.tudorgirba.com
>> www.feenk.com
>>
>> "Obvious things are difficult to teach."
>>
>>
>>
>>
>>
>>
>>
> --
> Cheers,
> Alex

Reply via email to