web-dev-qa-db-ja.com

WindowsからLinuxへの移行

これら2つの事実を調整する必要があります。

  1. Linuxでの作業には不安があります。
  2. Linux用のソフトウェアを開発する必要があります。

背景:Windowsで10年以上のプログラミング経験があります(ほとんどがC/C++ですが、.NETもいくつかあります)。FreeBSDを自宅で約3年間使用していました(その後、 Windows)、そして私はLinuxであまり運がなかった。そして今、私はLinux用のソフトウェアを開発しなければなりません。計画が必要です。

Windowsでは、プログラミング言語、コーディング対象のAPI、IDE(VisualStudio)、およびトラブルシューティング用のいくつかの非常に基本的なツール(Depends、ProcessExplorer、DebugView、 WinDbg)。それ以外はすべて自然に発生します。

Linuxでは、それは非常に異なる話です。 Firefoxプラグインからリンクすると、DLL(申し訳ありませんが、共有オブジェクト)がどのようにロードされるのか、一体どうやってわかるのでしょうか?__asm int 3/DebugBreak()をソースを作成してプログラムを実行し、OSにデバッガーを呼び出させますか?地獄のリリースビルドがappLoaderと呼ばれるものを使用するのに、デバッグビルドが何らかの方法で動作するのはなぜですか?最悪の場合、Linux開発環境をプロビジョニングする方法?

それで、憎しみは通常十分に知らないことに関連していることを考慮に入れて、あなたは何を勧めますか? EmacsとGCCで大丈夫です。 Linux管理者またはユーザーとして自分自身を教育する必要があり、適切なトラブルシューティングツール(straceはすばらしい)を学ぶ必要があります。これは、上記で述べたものと同等です。

Linuxを最初から実行する必要がありますか?それとも、何冊か本を読む必要があるのですか(Kernighanの「UNIXプログラミング環境」とStevensの「Advanced Programming ...」を読んだことがありますが、もっと実用的なものを学ぶ必要があります)。または、自宅のコンピュータにLinuxディストリビューションをインストールする必要がありますか?

57
rincewind

各OSが動的リンクを実行する方法を説明する記事 LinuxおよびWindowsでの動的リンク が興味深いかもしれません。記事 共有ライブラリ検索パス は、ライブラリの検索方法を説明しています。また 静的、動的、ロード可能なLinuxライブラリ は非常に優れています。 Linuxライブラリの良い点は、バージョン管理やライブラリのいくつかのバージョンのサポートがWindowsよりも優れていることです(AFAIK、私はWindowsを使用していません)。 SolarisおよびLinuxでのライブラリインターフェイスのバージョン管理 を参照してください。これらの記事は本当にあなたを図書館でカバーさせてくれるはずです。

GDBは非常に強力で、良い紹介はおそらく RMSのgdbチュートリアル です。条件付きブレークポイントについて調べたい場合があります。 __asm(int 3)に相当するものについては、質問 Linux上のgdbに対してプログラムでCまたはC++コードにブレークポイントを設定する を参照してください。

Marc Rochkindの本 Advanced Unix Programming は必読のIMHOです。たくさんの例があり、すべてのPOSIX/SUSトピックを非常によく説明された方法でカバーしています。これは、これまで読んだこのトピックに関する最高の本です。

しかし、あなたの人生を楽にするために、Qtのようなものを抽象化する高レベルAPIを使用することを実際にお勧めします。また、クロスプラットフォームの記述がずっと簡単になります。

Linuxを最初から実行することは、Linuxシステムがどのように構成されているかを理解するのに役立ちますが、開発者の観点からは、Linuxシステムに関する知識はあまり向上しないと思います。ただし、Linux環境にはどの部分があるか(そしてwhy)もわかるので、Linuxをより快適に使用できます。 Linux From Scratchを使用すると、Linuxが大きなブラックボックスになることはありません。

62
DarkDust

straceがお好みなら、忘れないでください ltrace :ライブラリ呼び出しと同等です。
また、はい、お勧めします Linux From Scratch 。これは、OSのコア要素とそれらがどのように組み合わされるかを理解するための良い練習です。
最新の完全なシステムプログラミングリファレンスの扱いについては、 Linuxプログラミングインターフェイス を入手することをお勧めします。

16
entropo

Mac OS Xはメルセデスのようなものです。最もきれいできれいですが、コストがかかります。 Windowsはトヨタのようなものです。それはあなたをそこに連れ戻します。

Linuxはホットロッドのようなものです。人々が掘り下げて分解し、再び組み立てるのです。 Linuxは、コンピュータを使いたいだけの人のためのものではありません。コンピュータを愛する人のためのものです。コンピューターを愛さない人は、コンピューターから離れてください。

Windowsで学んだことはあまりうまく翻訳されません。しかし、あなたは内部を見て、エンジンが動くのを見ることができます。

Linuxを新しいおもちゃにしてみてください。新しいおもちゃで遊んでクロールして、何が起こっているのかを確認できます。 Windowsで簡単なことは、Linuxでは難しくなります。 Windowsでは不可能なことがLinuxでも可能です。

コンピューターが好きならLinuxも好きです。コンピュータが好きではないのに、なぜプログラミングをしているのですか?

12
Andy Canfield

Monodevelopを使ってMonoで開発するのはどうですか?これにより、.NETでの経験を再利用することで、簡単に始めることができます。

9
Johann Blais

それを最初から見ると、大変なことです(ちょうど、Linux開発者がWindows開発を任されているようなものです)。この問題に一度に取り組みます。

  • まず環境設定を取得します(コンパイラ、IDE-はい、存在します。Netbeans/ Eclipseなど)。
  • 次に、より高いレベルのAPIをインストールします(boost/Qtなど)
  • ゆっくりと始め、すぐに解決する問題がある場合は、コードをコンパイルします(またはゼロから書き始めます)。開発プロジェクトに取り組む場合と同様に、最初に機能しているもの(つまり、OS固有の必要のないもの)を入手します。インタラクション)、そしてあなたが思わぬ障害を起こしたとき-検索では、誰かが以前に同じ問題に遭遇し、それを解決したと確信しています。

最も重要なことは、すべての主観的な意見をドアに残しておくことです。そして、いいえ、あなたはLinuxで開発するために第一人者である必要はありません。私はすべてを回避するのに十分知っています。しかし、私はそれで快適です...

8
Nim

私はあなたが質問であなたの質問に答えたと思います:

「Windowsでは、プログラミング言語、コーディング対象のAPI、IDE(VisualStudio)、およびトラブルシューティング用のいくつかの非常に基本的なツール(Depends、ProcessExplorer、DebugView)を知っているだけで済むようになります。 、WinDbg)その他はすべて自然に発生します。」

Linuxでは、プログラミング言語、API(またはいくつか)、IDE(EclipseまたはNetBeans、さらにGeany、Emacs、またはvim)を知っているだけで済むでしょう。のような)とトラブルシューティングのためのいくつかの基本的なツール(gdb、トレースツール、lint、htop、ps)。

あなたは、Windowsプログラミングエコシステムに投資した多くの知識を持っています。その多くは(うまくいけば)抽象的な知識(コンパイラー、デバッガー、共有ライブラリー、プロセス、スレッドとは何か?それらは何をするのか?)であり、さまざまなツールに慣れれば簡単に翻訳できます。一部はドメイン固有ですが(プロジェクトにXを追加すると、DLLがリンクされますか?))、Windows内であるクラスの言語から別のクラスに移動する場合でも、新しい学習が必要になります。

VMにUbuntuまたはFedoraをインストールし、EclipseまたはNetBeansのチュートリアルでC++ Hello Worldのチュートリアルをいくつか読み、Eclipse/NetBeansのチュートリアルでいくつかのデバッグを読んで、脳の自然な能力を引き継いでください。リラックスして仕事に取り掛かれば、アイデアが翻訳されます。

6
Justin

The success or failure of many thing in life comes down to our attitude, looking for positives and keeping your mind focused on the positives will do more to adide you as you start down this new interesting adventure.

Windows環境での作業に習熟するまでにどのくらいかかりましたか。始めたばかりで簡単だったと言えるかもしれません。しかし、その前にウィンドウを操作するのに数年かかりました。拳プログラムを作成する前に、Windowsをどのくらい使用していましたか。私にとっては8年でしたが、今ではほぼ5年間Linuxを独占的に使用しています。私は今やLinuxよりもWindowsに習熟しています。新しいシステムに慣れるには、少なくともその時間を自分に与える必要があります。

ウィンドウズでは生きていけないアプリケーションのリストから始めて、* nixの世界で別の方法を探してください。 http://alternativeto.net/ とWikipediaの詳細なセクションは、ここで役立ちます。

以下は、非常に役立つことが証明できる代替ソフトウェアのリストです。ここにあなたが言及したもののいくつかの代替案があります。

あるシステムから別のシステムに移動する際のその他の役立つリソース

より良いパワーユーザーまたは管理ユーザーになることについては、これらのリソースを見てください

また、* nixの世界を見てからしばらく経っていないようです。 Fedorasusedebian 、または私の好きなワークステーション bunt からの新しいディストリビューションリリースのいくつかをお勧めします。 。

これで、システムの内部やウィンドウのような基本を知らなくても済むようになります。私は最低限で逃げようとはしません。 Linuxが実際に開発を支援するツールであり、それを開発するオペレーティングシステムではなく、それを支援するツールである場合、それは役に立ちます。

Linux From Scratchは、特にLinux向けに開発している場合は非常に重要であり、非常に具体的で技術的な意味があります。 I.E.カーネル用に開発したい、またはLinuxを実行しているスーパーコンピュータにプログラムを移植したい。それでもそれは非常に便利です。私はあなたがちょうどUbuntuで始めようとしている間にあなたがおそらく数ヶ月間それを残すことができると思います。 Ubuntuは、MacとWindowsのがうまく機能するの世界に近くなります。

6
nelaaro

マンページを読んで、Unix全般を学びました。少なくともそれらをすくい取る必要があります。はい、私はそれらすべてを意味します。私がそれを使用してmanページのディレクトリーにcdし、一度に1つのセクションを攻撃する方法。

私はこれを使います:

for i in *; do f=`basename $i .gz`; man `basename $f .1` ; done

... 。1を、読んでいるセクションの番号、.2、.3などで置き換えます。ループから抜け出すには、Ctrlキーを押しながらZキーを押しながらCキーを押しながらCキーを押します。 Linuxディストリビューションの格納方法が異なる場合、つまりcmdname.1.gzとしてではない場合、距離は異なる場合があります。

説明に目を通すだけでなく、興味深いものであればもっと詳しく説明します。セクション1、2、3はプログラマにとって最も重要です。 1は、コンパイルツールやさまざまなフォレンジックユーティリティを含む一般的なユーザーコマンドをカバーしています。 2はシステムコール、3はライブラリコールです。

3
Hack Saw

自分が好きではないことを強制するな。開発環境としてWindowsを使用し、移植可能なコードを記述して、Linux用にクロスコンパイルし、VMでたまにしかテストしないでください。

3
SK-logic

私は似ているが異なる仕事を課された2人のうちの1人でした。私は幼稚園から高校までの学区で働いており、ビジネスシステム(人事、財務など)はHP3000/TurboImage dbからLinux/MS SQLプラットフォームに移行しています。私はMS SQL側に慣れています。しかし、Linux側ではありません。私たち2人はプログラミング側ではなく、管理側にいます。プログラミングは外部で行われます-K-12組織向けのサードパーティのビジネスアプリ。

私は週末に5週末のLinux入門(Redhat)クラスを受講しました-たいていはコマンドラインモードで行われました。Linuxのやり方をすぐに始められるので、時間を割く価値はありました。明らかにクラス/教師に応じてYMMV。

あなたは「すべての最悪:Linux開発環境をプロビジョニングする方法?」と述べましたか?あなたはすでにWindowsに精通しているので、vmWare Workstationのコピーを入手することを強くお勧めします。これにより、ワークステーションとしてWindowsを維持し、ゲストシステムとしてLinuxをインストールできます。必要に応じて、削除、すすぎ、繰り返しを行うことができます。適切な設定ができたら、スナップショットを作成できると思いますが、どのバージョンがスナップショット機能を備えているかは、はっきりとは言えません。また、vmWareワークステーションのルートで複数の開発設定を有効にする場合は、メモリを増やしてください。

また、ゲストのLinux OSとしてCentOSを使用することをお勧めします。私が理解していることから、それはブランディングやセールスピッチやサポートコストのないRedHatのようなものです。私は他のLinuxフレーバーに慣れていないので、それらについての入力はできません。

グレッグ

2
Gregory Thomson

それがプラットフォームで機能するかどうかはわかりませんが、プログラミング言語では、自分が得意なものに慣れ、快適になった方法を考え、それらの経験やアクティビティを自分の目的に合わせて再生してみると役立つと思いますm学ぼうとしています。

おそらくそれらの行に何かありますか?

しかし一般的に言えば、GNU/Linuxに対する私の興味と自信は、Windowsよりもいじくり回しやすい(そして初期の頃はいじくり回す必要がある)ことによってもたらされました。私は物事を機能させるために多くのものをいじる必要があり、それは私が多くのものを学ぶのを助けました。物事は今ではずっと良くなっていますが、それらすべての時間が助けられました。

2
Noufal Ibrahim

これについて考えてみてください。Windowsについて何も知らなかったけれども、Windowsについて学び、やがてWindowsに慣れてきました。

次に、MSは、使い慣れたプログラミングシステムをすべて.NETに変更し、DLL、COM、およびアセンブリ、GAC、アプリドメインなどを学ぶ必要がなくなりました。あなたはそれらを大丈夫と学びました。

では、なぜLinuxで同じことをするのが心配なのでしょうか。

Webには、あらゆる種類のプログラミング環境向けの「はじめに」のチュートリアルがたくさんあります。ここでGCCと言ったので、C++開発を想定します。 Eclipseを入手して、Eclipseプラットフォームの上に [〜#〜] cdt [〜#〜] (c dev tools)をインストールします(Eclipseは多目的IDEであり、C++で使用できます) 、PHP、Javaなど。ただし、VSのようにすべてを事前にインストールしたくないので、言語に合わせてツールをインストールする必要があります。インストールには3日かかります:))

Webには使いやすいチュートリアルがあります。 IBMにはここに1つあります 非常に包括的です。

デバッグツール... Eclipseには埋め込まれています( tutorial )ですが、あなたが言及したようなツールをたくさん見つけることができます。ウェブを検索するだけで、たくさんのオプションが見つかります。コアダンプの読み取り方法を理解するには少し時間がかかります(たとえば、Windowsのユーザーダンプとは異なります)が、そこにたどり着きます。

ブログをあなたの経験で始めることも価値があるかもしれません。それはあなたがあなたがやったことを思い出させることを可能にするだけでなく(例えば、あなたの好きなようにEclipseを設定します。あなたが再びそれをする必要があるときあなたは忘れるでしょう)年の時間)が、それはあなたの状況の他の人を助けるでしょう。

1
gbjbaanb

私は両方のプラットフォームが好きで、ユーザーインターフェースと開発エコシステムのすべての違いについて、それらはカバーの下での違いよりも似ています。実際、ほとんどのWindowsの概念では、インターネットを検索するだけで同等のLinuxの概念を見つけることができます。

そうは言っても、「Unixの方法」で物事を行う方法を学ぶことを強くお勧めします。バグの多いGUIフロントエンドではなく、コマンドラインを使用します(ここでは主にgdbについて話しています)。 IDEを探すのではなく、代わりに一連の専用ツールを使用する方法を学んでください。 (vimを指す)優れたエディターを選び、それをよく学んでください。専門家になる予定がない場合でも、makeの仕組みを読んでください。 Linuxが好きになるかもしれません。オタクフレンドリーで、遊ぶのが楽しいです。

1

Linuxを最初から実行する必要はないと思います。私があなただったら、Ubuntuに行きます。それはより快適で、debianに基づいているので、利用可能な技術資料がたくさんあります。

Linuxへの最初の飛び込みをもっとしたい場合は、Gentooが良いオプションです。それはあなたが設定とカーネルについてかなりたくさん読むことを要求します、しかしそれはまたあなたにafで動作するためにあなたにかなり機能的なシステムを与えます

0
anders.norgaard

私が最初に尋ねる質問は、あなたが開発したいものは何ですか?それがGUIベースのアプリケーションである場合、それはカーネル拡張のようなものを書く必要があることとは異なります。

GUIアプリの場合、最も簡単な方法は、独自の開発環境(Qt-Creator)があり、クロスプラットフォームであり、Windows/Linuxで使用できる1つのAPIだけを学習できるQtを使用することです。/OSX、さらにはモバイル開発。 WindowsのビジュアルスタジオやOSXのXCodeのように、グラフィカルエディターからウィンドウやアイテムを作成してレイアウトでき、APIは多数のサンプルアプリケーションで簡単に取得できます。

さらに低レベルにする必要がある場合は、コマンドラインでLinuxを使用する方法がわかったら、ディレクトリを走査する方法、ファイルを操作する方法、権限を理解する方法などを理解してから、gccで単純なプログラムをコンパイルする方法を読んでください。ファイルをリンクして実行可能ファイルを実行する方法、次にgdbでデバッグする方法。

あるいは、それが少し難しいと思われる場合は、Eclipseまたは別のIDEをダウンロードすることもできますが、時間と労力を最初にコマンドラインに費やすと、長期的にはLinuxにはるかに慣れるでしょう。

0
TheDarkKnight

グーグル「アートのUnixプログラミング」とそれを読んでください。 IMO、あなたの主な難しさは異なる哲学であり、その本はこのための優れた読書です。

また、* n * xとWindowsシステムの間の明白ではないが技術的に非常に重要な違いについても紹介します。これらは、Linuxで別の方法を実行することが理にかなっている理由を理解するための鍵となります。

0
user59625