コード解決のクロスプラットフォームの開発


こんにちは!私はザビエルJouvenotと今日、私は解決策に少し反映したいAdvent Of Code 2021 私がこれまでにした挑戦、そして、より正確にどのように、そして、なぜ私は私の解決クロスプラットフォームを作りましたか.
セルフプロモーション:ここでは、私に従うことができますし、プログラマや作家として私の仕事をチェックするいくつかのソーシャルネットワークです😉
Personal website , , , CodeNewbie , Medium , GitHub

コードジャーニー
この記事を読んでいるあなたのほとんどは知らないかもしれませんが、コードチャレンジの出現との最初の出会いは、実際に私が最初の個人的なウェブサイトを作成した時と一致します10xlearner.com ) アンドマイfirst post 私がコード2015の出現の最初の問題の解決方法を考え出しました.たとえ2019年になっても、私はコードの出現によって提案された最初の挑戦を始めたかったのです.
私は、コード2015の出現の第18の最初の問題のための1つの18のポストを作成し終わります、そして、私は他のプロジェクトに行きました😄.
2年7ヶ月後、私はコード2021の出現の最初の挑戦に私のソリューションについての新しいポストを投稿しました.私の目標は、コード2021の出現の日の問題に対する解決策を見つけた方法について、1つの記事を毎週書くことでした.私たちは今10日(私はこのポストを書いている)解決されます.そして、私はそれが私にとって非常に興味深い経験であると言わなければなりません.
また、私は少しの会話をしましたAdvent Of Code reddit , そして、私は私がどのように異なる問題にどのように私の解決を改善することができたか、そして、私がどのように私のポストをより面白くて、より面白くすることができたかについていくつか本当に本当におもしろいフィードバックを加えます.すべてのフィードバックで、私は決定的にいくつかの進歩を行った!私は、私のコンテンツをより魅力的にするために異なることを試みました.問題への私のアプローチさえ少し変化しました、それは良いものです.
それでも、問題の解決方法を考え出すとき、私の主な目的の1つは、彼らがC +で流暢でないとしても、解決を見つけるのに用いられる論理を誰にも理解させるのを可能な限り簡単にすることです.私はしばしばC +はエリートの言語であり、理解し、理解するか、使用するのが難しいと考えている人々を見つけると私は人々がこれはないと示すことを望む.すべてのプログラミング言語のように、あなたは非常に読むのが難しいコードを書くことができます、あるいは、人々が理解するために本当に表現力のあるコードを書くことができます.
これらの目標を念頭に、私はコードの問題の出現で私の旅を続けるつもりです、それらを解決するために別の解決策を実験し、プログラマとして、作家としての過程で改善.😊

なぜそのような挑戦のクロスプラットフォームゴール
あなたが社会的なメディアで私についてきたか、私の過去の記事を見たならば、あなたは私がコード品質、ソフトウェアツール、オートメーションとdevopsのような若干の主題に本当に興味があるのを見ます.そして、コードの出現の異なった問題のためにコードを書くとき、私は改善の余地があるということを知っているので、私自身でコードに完全に満足しました.だから私はそれを改善することを決めた.
これらの解決策のために生成するコードを改善するための最初のステップは、CGIプロセスを設定することであり、コードがいつでもコンパイルされることを確認するために、将来変更がどのようになるかを確認した.そうするために、私はazureパイプライン(私が1を選択しなければならなかったので)を使用しました、そして、私は私のコードが3つの主なオペレーティングシステム(Windows、OSXとLinux)でコンパイルされることができることを確認することができる構成を作成しました.
将来的にはいくつかの他の改良を行っています.別のコンパイラを使用して、いくつかのプリンタ/静的解析ツールを追加したり、プロジェクトにいくつかのテストを追加したりします.しかし、CIを持っている私は、私が書いているコードと固体ベースに自動フィードバックを持っているために取る最初のステップのように思えたし、私が言及したすべての改善を統合します.😊

どのようにクロスプラットフォームの互換性を達成する
前の部分で言ったように、azureパイプラインを使っているので、私のコードが市場のメインOS上でコンパイルされていることを確認できます.まず最初に知っておくべきことはCMake 任意のプラットフォーム上で標準であるコンパイルプロセスを生成するために.実際に、以下のコマンドを使ってコードをコンパイルできます.
# in a build folder
cmake .. -G "<generator_to_specify>" # Generates the solution to compile
cmake --build . # Compiles the solution generated previously
このプロセスから、コンパイルプロセスを記述するAzureパイプラインの簡単なテンプレートを作成できました.それはファイルです.azure-pipeline/build.yml 私のgithubリポジトリで.以下のようになります.
parameters:
  - name: 'generator'
    type: string
  - name: 'root_directory'
    type: string

steps:
  - script: |
      cd "${{ parameters.root_directory }}"
      mkdir build
    displayName: Creates build folder
  - script: |
      cd "${{ parameters.root_directory }}/build"
      cmake .. -G "${{ parameters.generator }}"
    displayName: Generates the solution
  - script: |
      cd "${{ parameters.root_directory }}/build"
      cmake --build .
    displayName: Compiles the solution
最後に、私が残したすべては、Azureパイプラインによって提供される異なるOS上でこのテンプレートを使用することです.あなたはそれを見つけることができます.azure-pipelines.yml file 私のgithubリポジトリで.次のようになります.
parameters:
  - name: days
    type: object
    default: ['Day 1', 'Day 2', 'Day 3', 'Day 4', 'Day 5', 'Day 6', 'Day 7', 'Day 8', 'Day 9', 'Day 10']

jobs:
  - job: Advent_Of_Code
    strategy:
      matrix:
        visual_studio_2019:
          imageName: 'windows-2019'
          generator: Visual Studio 16 2019
        visual_studio_2022:
          imageName: 'windows-2022'
          generator: Visual Studio 17 2022
        xcode:
          imageName: 'macOS-11'
          generator: Xcode
        unix_makefiles:
          imageName: 'ubuntu-20.04'
          generator: Unix Makefiles
    pool:
      vmImage: $(imageName)
    steps:
      - ${{ each day in parameters.days }}:
          - template: .azure-pipeline/build.yml
            parameters:
              generator: $(generator)
              root_directory: ${{ day }}
パラメータdays 私が毎日の解決に献身的なフォルダを持っているように、私がどのソリューションをコンパイルしたいかを指定できます.そしてmatrixpool Azure Pipelineは4つの仕事を作ります:Windows(Visual Studioの異なるバージョンで)の上の2、OSX(Xcodeで)の1とLinux(Unix Makefileをジェネレータとして)の1.そして最後に${{ each day in parameters.days }} テンプレートを指定できます.azure-pipeline/build.yml 前に定義された各日と各発電機.


クロスプラットフォームとCIの利点
Azureパイプラインを設定したとき、私はコード2021の出現の5日間を解決しました.しかし、azureパイプラインを設定するすべての私がしなければならなかった!実際に、私が書いたコードは、プラットフォームではなく、実際にはLinuxでコンパイルされたものです.それらの問題は異なったコンパイラの実装の違いから来ます、そして、私は少し適応しなければなりませんでした.実際には3種類の問題しかなかった.

  • Commit 0784ae : C +では、何が呼び出されますか?alternative keywords ( and 替える&& , or 替える|| , …), Visual Studioでは、それらを使用できるようにいくつかの設定を行う必要がありました.オプションを追加することで/permissive- Visual Studioでコンパイルするときは、この問題を修正できました.

  • Commit d91247 : 発電機Unix Makefiles 明らかにいくつかの魔法を行うことができます!ヘッダファイルを含んでいなくてもvector 他のジェネレータ(XcodeとVisual Studio)がなかった間、それはまだコンパイルすることができました.🧙

  • Commit 9479d4 : 私がキーワードでマークした1つの機能constexpr 実際にはこれを持つことができませんでしたkeyword . 確かに、関数を使用するのでstd::absconstexpr C +の標準ドキュメントでは、私の関数はこのキーワードを持つことができます.それで、このキーワードを取り除くことによって、私は問題を修正することができて、すべての最初の5日の間クロスプラットフォーム解決をすることができました😊
  • CIが設定されれば、私は新しい日の問題の新しい解決策を書いたときに更新することでした.これはazureパイプラインの設定ファイルに1つの変更しか必要ありません.
        default: ['Day 1', 'Day 2', 'Day 3', 'Day 4', 'Day 5', 'Day 6', 'Day 7', 'Day 8', 'Day 9', 'Day 10']
    
    解決する新しい日を加えるために

    結論
    結論として、私はコード2021の出現は、まだ私のための楽しい経験だと言うことができます.私はそれらを解決し、その過程で自分自身を改善し続けるつもりです.😊
    コード2021の終わりから終わりまでの、そして/または、azureパイプラインの構成の解決策を見たいならば、あなたは私の上に行くことができますGitHub account , 完全な解決策を探る、コメントを追加したり、質問をする場合は、この記事を読むプラットフォームで、それはまた、私の記事の品質を向上させるのに役立ちます.😉
    この記事を読んでくれてありがとう.
    そして次の記事まで、素晴らしい一日を😉

    面白い関連
  • constexpr documentation
  • std::abs documentation
  • Alternative C++ keywords
  • Azure Pipelines Microsoft agents
  • CMake
  • Advent of Code

  • 10xlearner website , , , CodeNewbie , Medium , GitHub