GoblogGoブログ甚の自家補静的゚ンゞン

私はテキストを曞くのが奜きで、䟋をデバッグし、詊しお、分析するのが奜きです。 気に入らないのは、曞匏蚭定、画像のアップロヌド、レむアりトの確認などです。



怠lazのため、私はBlogspotを䜿い始めたした。 ここでは、テンプレヌトの海、あらゆる皮類のりィゞェット、Googleによるむンスタントむンデックス䜜成、統蚈情報が異なりたす。これは、コメントもツリヌのようになったためです。 たあ、すべおがうたくいきたすが、残念ながら、Blogspot゚ディタヌはプログラマヌの投皿を䜜成するためのものではありたせん。 コヌドを埋め蟌む必芁がある堎合、たたはテヌブルが異なる堎合、苊痛が始たりたす。 たずえば、私のブログでは、プログラミングに関するものではなく、 半熟卵、先生 、「機䌚」Blogspotで十分です。



たた、元の投皿を、裞のHTML圢匏ではなく、通垞の圢匏で保持したいず思いたす。 ブログの資料はあちこちに散らばっおいるこずが刀明したした。 たず、゚ディタヌでテキストを蚘述し、リンクず画像なしで段萜に分割し、最埌にほが完成したドキュメントを保存したす。 次に、HTML組版が開始されたす。その間、HTML自䜓に加えお、元のテキストが修正されたす。 同時に、元のファむルの曎新は既に面倒であり、実際、「生の」圢匏のたたです。 たた、「ドラむ」圢匏では、HTMLのゎミのみが残りたす。 しかし、これで話は終わりではありたせん。 倚くの堎合、発行埌、タむプミスに気づき、Blogspotにアクセスしお、ペヌゞ䞊で盎接線集したす。 繰り返したすが、最初のオリゞナルずそのロヌカルのob-HTMLバヌゞョンは修正されおいたせん。 最埌に珟圚のバヌゞョンの投皿はBlogspotのみにありたす。 もちろん、ブログ党䜓の自動バックアップを䜜成するこずもできたすが、これもたたすべおがHTMLのみで行われたす。



しばらく前に、私はReSTを䜿い始めたした 。 ここで、人生はどういうわけか気分が良くなりたした。 ReSTを䜿甚するず、倚少予枬可胜なマヌクアップ段萜、リンク、コヌドでテキストを蚘述でき、そこからHTMLが生成され、これが再び手動でBlogspotに挿入されたす。 googleclを介しお投皿のプレビュヌを自動化する詊みは、実際には倱敗したした。 繰り返したすが、ペヌゞ䞊のタむプミスを修正した埌、ReSTの元のドキュメントが叀くなった堎合、問題は残りたした。 さらに、ReSTは画像の問題を解決したせんでした。 完党にプレビュヌできるように、事前にどこかにレむアりトする必芁がありたした。



理由を説明するこずはできたせんが、Wordpressのような動的゚ンゞンのアむデアは、どういうわけかおびえたした。 投皿をデヌタベヌスに保存するずいうアむデアは、やり過ぎだず思いたす。







vak.ruのように、䟋えばDoku Wikiなどの䞭間的な解決策にほがすでに決たっおいたす。 ここでは、゚ンゞンは動的ですが、ペヌゞのコンテンツはファむルに保存され、バヌゞョン管理がありたす。 Dokuは、ブログだけでなく、サむト党䜓の゚ンゞンずしお䜿甚できたす。 デザむンはいですが、写真ず任意の添付ファむルはシステムによっおサポヌトされおいたす。



TiddlyWikiに基づくブログ-私もほずんど賌読しおいる別のオプションがありたした。 TiddlyWikiは、私のお気に入りのWindowsレコヌディングツヌルです。 これに぀いおはすでに曞きたした。 なぜWindowsのみですか Macでは、単玔なテキストファむルでメモを䜜成し、ドキュメント内たたはデスクトップ䞊にある意味でメモを䜜成したす。Spotlightは、コンピュヌタヌ䞊のすべおのものをむンデックス付けし、単語の断片を即座に怜玢できるようにしたす。 TiddlyWikiの䞻芁な機胜であるむンスタント怜玢はあたり意味をなさないこずがわかりたした。 しかし、気が散りたした。



TiddlyWikiをブログプラットフォヌムに倉えたファンがいるこずがわかりたした。 静的-動的倉異䜓の䞀皮。



たずえば、このような゚ンゞンを備えたブログオプションは、 Rich SignellのWork Logです。 私の意芋では、難解です。 たずえば、少なくずも同じDisqusでコメントを固定する方法は明確ではありたせん。 しかし、誰かが興味を持っおいるなら、公開ホスティング-tiddlyspotさえありたす。



そしお本圓に、玔粋に静的な゚ンゞンのアむデアに興奮したした。 ここの矎しさは、そのようなブログをどこでもホストできるこずです。 ここでは、デヌタベヌスだけでなく、サヌバヌ偎のスクリプトも必芁ありたせん。 しかし、さらに-もっず。 GitHubたたはHerokuを䜿甚するず、静的サむトをホストできるだけでなく、gitを介しおコンテンツを管理するこずもできたす。



たずえば、静的なゞキル゚ンゞンがありたす。 Jekyllでは、投皿はMarkdownたたはTextileマヌクアップを䜿甚しお蚘述されたす。 プロゞェクトに任意のファむルを远加するこずもできたす。これは、サむトを生成するずきに、倉曎なしでレむアりトされたす。 実際、これはブログずしおいく぀かのファむルを蚭蚈できるサむト゚ンゞンです。



コメントは、ブログの䞻芁な「ダむナミクス」ずしお、たずえばDisqusを通じお実装できたす。 ずころで、Zenの最高床の静的ブログには、 静的コメント 私にずっおも、このフレヌズは矛盟衚珟ですがありたす。 ここでのアプロヌチは次のずおりです。以䞋の投皿には、以前に入力したコメントが静的に衚瀺されるセクションがあり、その隣に新しいコメントを入力するためのフォヌムがありたす。 コメントを入力するず、ブログの䜜成者に送信されたす。 それはそれを確認したたはしない、どこかをクリックし、コメントは静的なブログプロゞェクトのファむルの圢匏で配眮され、すべおが再構築されお公開されたす。 これは決しおリアルタむムではないこずは明らかですが、事前調敎を䌎うコメントのようであり、モデレヌタヌは週に䞀床連絡を取りたす。



私は議論に本圓に感謝しおいたす。このアプロヌチは私には向いおいたせん。 そしお、私は匕き続きDisqusを䜿甚しおいたす。 ちなみに、Disqusからコメントデヌタベヌスを完党に゚クスポヌトできたす。たずえば、突然それを離れる必芁がある堎合は、静的なペヌゞに倉換できたす。



しかし、ゞキルに戻りたす。 たずえば、GitHub PagesはJekyllを盎接サポヌトしその䜜成者はGitHubの共同蚭立者です、Jekyllプロゞェクトをレンダリングできたすただし、ロヌカルでレンダリングできたす。 gitを介しおJekyllプロゞェクトに入力するず、GitHub Pagesにサむトが衚瀺されたす。



Herokuでは、考え方は少し異なりたす。 HerokuはRubyをホストしおいるため、Herokuの静的サむトはペヌゞ自䜓ずそれらを提䟛するWebサヌバヌプログラムです。 怖いように聞こえたすが、Rubyではこのようなサヌバヌは非垞にコンパクトに芋えたす。たずえば次のようになりたす。



require 'bundler/setup' require 'sinatra/base' class SinatraStaticServer < Sinatra::Base get(/.+/) do send_sinatra_file(request.path) {404} end def send_sinatra_file(path, &missing_file_block) file_path = File.join(File.dirname(__FILE__), 'public', path) file_path = File.join(file_path, 'index.html') unless file_path =~ /\.[az]+$/i File.exist?(file_path) ? send_file(file_path) : missing_file_block.call end end run SinatraStaticServer
      
      





奇劙なこずに、Herokuでのホスティングは䞀般にGitHubでのホスティングよりも簡単です。 たた、Herokuでは、ブログのgitリポゞトリはプラむベヌトのたたですが、GitHubでは、他のすべおのプロゞェクトず同様にオヌプンになりたす。 ブログプロゞェクト実際にはサむトを閉じたたたにしおおくのは奇劙に聞こえたすが。 圌はすでにりェブを通じお完党にアクセス可胜です。



はい、GitHub PagesずHerokuの䞡方で、通垞の第2レベルのドメむンある堎合を「ねじ蟌む」こずができたす。



そこで、Herokuでホスティングするゞキルを遞びたした。 残念ながら、玔粋なJekyllを䜿甚する堎合は、スタむルずペヌゞレむアりトをれロから蚭蚈する必芁がありたす。 これが怠byによっお行われる堎合は、 Octopressを䜿甚できたす。



OctopressはJekyllに基づく静的なブログ゚ンゞンですが、矎しいHTML5ペヌゞレむアりト、䟿利なプラグむンの束、GitHub PagesずHerokuにブログを投皿する自動化機胜を備えおいたす。



そこで、Octopressを取り、前埌にひねり、いく぀かの投皿を詊み、ブログのレンダリングをロヌカルでテストし、HerokuずGitHub Pagesにアップロヌドしたした。 すべおが軟膏にあるように芋えた。



次は、Marlezonバレ゚の最も退屈な郚分でした。お気に入りのBlogspotから投皿をドラッグアンドドロップしたす。 実際、カットアンドペヌストでこれを手動で行う必芁がありたした。 3週間の苊痛、そしお私が凊理した䞍幞な300件の投皿。



すべおが新しい静的ブログを立ち䞊げる準備ができたした。 しかし、ここで䞻な倱望が私を埅っおいたした。 Rubyで曞かれた貎重なJekyllが私の300の投皿を悲惚なものにしたした泚意-15分Mac Airで。 そしお、あなたが理解しおいるように、最初はたくさん詊しお、再組み立おし、再詊行し、再組み立おする必芁がありたした。 そしお、そのような完党な再組み立おの時期は、どの門にも登りたせんでした。



pokeメ゜ッドを䜿甚しお、私はJekyll / Octopress゚ンゞンのボトルネックを発芋したした。これらの15分の倧郚分は、 atom.xml



ファむルRSSフィヌドの生成にatom.xml



れたした。 䜕らかの理由で、元のテンプレヌトでは、最埌の20件の投皿のみがこのRSSファむルに含たれおいたした。 しかし、私は小さなブログを持っおいるので、そこにすべおの投皿を含めたした。そしお、このファむルの生成時間はブログ党䜓の15分のビルドに぀ながりたした。



これらはすべお、なんずなくばかげおいるように思えたしたRubyに察する私のすべおの愛を蟌めお。 少し考えおその頃たでにJekyllの内郚構造をある皋床理解しおいた、Jekyllを高速化しようずするのを嫌がり、同様のアむデアで独自の静的゚ンゞンを䜜成する必芁があるのだろうか 結局のずころ、これはファむル、テキスト、そしお堎合によっおはテンプレヌトを扱うだけです。 さらに、ゞキルにはどんな圢の倚蚀語も存圚せず、そこにそれを远加する蚈画がありたしたが、自分の゚ンゞンで私の手は完党に解かれ、すべおが調和しお矎しくできたす。



䜕に曞きたすか 男らしいC ++ / boostで。 非垞に高速に動䜜したすが、退屈です。 Goに決めたした。 ネむティブで非垞に高速なコンパむル実際には、開始フェヌズず組み合わされおいるため、コンパむルフェヌズはありたせん、文字列ずファむルシステムの䟿利な䜜業、メモリガベヌゞコレクタヌの簡略化された䜜業、正芏衚珟、配列、ハッシュ、テンプレヌトのラむブラリ、 Markdownのラむブラリ 。 最埌のものを陀くすべおは、箱から出しおすぐです。 パフォヌマンスの問題はたったくないはずです。 ここで、Go 1リリヌスが発衚されたばかりで、珟圚はWindowsおよびMac甚の通垞のディストリビュヌションがありたす。



それで、3晩埌、私の自転車が生たれたした-Goblog 。 プロゞェクト党䜓が開いおいたす。 サむトずその゜ヌスは䞀緒です。



動䜜原理



䞻に2぀の堎所がありたすプロゞェクトず組み立おられたブログサむトです。 1぀は゜ヌスファむルです。 アセンブリプロセス䞭に、ロヌカルディレクトリ構造を維持しながら、プロゞェクトのファむルがアセンブリされたサむトにコピヌされたす。 デフォルトでは、ファむルはバむナリのように倉曎されずにコピヌされたす。 ファむルの拡匵子がhtml



、 xml



たたはjs



堎合、このファむルはGoテンプレヌトシステムで実行されたす 。 markdown



ダりン拡匵子を持぀ファむルは、テンプレヌトの前にマヌクダりンラむブラリによっおさらに凊理されたす。



ディレクトリ



_engine



ディレクトリ内の_engine



ディレクトリずファむル



投皿は、特別なタむトルず名前を持぀マヌクダりンファむルです。 これらのファむルは、日付サブディレクトリを含む別の/blog



ディレクトリに配眮されたす。 投皿に関する情報は、テンプレヌトから衚瀺される特別な倉数に収集されたす。 たた、怜玢の逆むンデックスは投皿に基づいおいたす。



レむアりト



レむアりトの抂念は、Jekyllから継承されおいたす。 投皿たたはペヌゞのヘッダヌにlayout



属性がある堎合 たずえば 、指定されたレむアりトテンプレヌト _layouts



ディレクトリからが読み蟌たれおレンダリングされ、投皿たたはペヌゞの本文が特定のレむアりトの堎所に挿入されたすこのPage.child Page.child



その埌、すべおが䞀緒にレンダリングされたす。 これにより、類䌌したペヌゞのグルヌプ投皿などを均䞀に配眮できたす。 レむアりトはネストできたす。



発電機



そしお今、実際には、ゞェネレヌタヌはmain.goです。



 _engine



ディレクトリでビルドするために行うこずは、 _engine



です。



 make
      
      





以䞋が衚瀺されたす。



 _engine$ make gofmt -w=true -tabs=false -tabwidth=2 main.go go run main.go Go static blog generator Copyright (C) 2012 by Alexander Demin Words in russian index: 18452 Words in english index: 3563 15.672979s Processed 344 posts.
      
      





すべおが順調であれば、プロゞェクトのルヌト _engine



関連する..



内に、蚈算の準備ができおいるファむルが圢成されたす。 私のMac Airでは、組み立おに15秒かかりたすhello、Jekyll / Octopress、さようなら。 すべおがgitの䞋にあるため、どこでどのファむルが衚瀺され、消え、倉曎されたかを垞に明確に確認できたす。



その埌、サむトをロヌカルで確認できたす以䞋を参照。



すべおの準備が敎ったら、倉曎されたファむル _site/



からの゜ヌスず収集されたファむルの䞡方をロヌカルリポゞトリに远加できたす。



git add ../*

git commit -m "...に関する新しい投皿"



そしお、GitHubペヌゞに配眮したす。



git push



push



ほが盎埌にpush



ファむルはdemin.wsに衚瀺されたす 。



Makefileには、䜜業を簡単にするための远加のコマンドがいく぀かありたす。



ロヌカルテスト



サむトをロヌカルで起動するには、䞀時的に「 127.0.0.1 demin.ws



」を/etc/hosts



远加し、ミニWebサヌバヌを起動したす。 Rubyでどのように芋えたか芚えおいたすか 小さいですね そしお今、Goのバヌゞョン server.go 



 package main import "net/http" func main() { panic(http.ListenAndServe(":80", http.FileServer(http.Dir("..")))) }
      
      





だから



 go run server.go
      
      





たた、サむトをロヌカルでテストできたすポヌト80でsudo



を実行しお「座る」必芁がある堎合がありたす。



原則ずしお、 /etc/hosts



觊れおlocalhost:80



アドレスを䜿甚するこずはできたせんが、 atom.xml



RSSフィヌドにはドメむンずの絶察リンクが含たれおいるため、RSSをテストする必芁がある堎合、なりすたしなしでこれを行うこずはできたせん。



構文の匷調衚瀺



Markdown拡匵機胜ずしお、コヌドブロックを挿入するための特別なタグがありたす。



 {% codeblock lang:xxx %} ... {% endcodeblock %}
      
      





このタグはOctopressから継承したした。 Markdownにはすでにコヌドの構文がありたす



 ``` xxx ... ```
      
      





ここで、 xxx



は蚀語です。



しかし、私のタグを䜿甚するず、たずえば、行番号の衚瀺、タブの倉換など、属性を簡単に远加できたす。



次に、構文の匷調衚瀺の問題を解決する必芁がありたした。 JavaScriptを盎接ペヌゞ䞊で色付けするオンラむンラむブラリをいく぀かねじりたしたが、それぞれに最小限の問題があったため、コヌドを静的に色付けするこずにしたした。



最初に思い぀いたのは顔料です。 すべおうたくいきたすが、Pythonのおかげで、動䜜が非垞に遅くなりたす。 15秒からサむトの組み立おを完了するたでの時間が2分に増加したした。 ほずんどの時間はコヌドの色付けに費やされたした。 すでに描かれた砎片や他のゎミのキャッシュに぀いお考えたが、短い怜玢の埌、問題は根本的に解決された。



タスクに適した蚀語で蚘述されたカララむザヌを䜿甚する必芁がありたした。 Source-highlightずHighlightの 2぀の遞択肢が芋぀かりたした。 どちらもC ++で蚘述されおいるため、ほずんど瞬時に機胜したす。



たずえば、ここで男性がpygmentsずsyntax-highlightのパフォヌマンスを比范したした 。



ハむラむトがもっず奜きだった。 より倚くの蚀語がサポヌトされおいたすたずえば、GNUのGoでもサポヌトされおいたせん。 ハむラむトに切り替えた埌、完党なアセンブリの時間は玄15〜16秒に戻り、満足したした。



カラヌラむザヌは、 {% codeblock %}



タグを凊理する正芏衚珟コヌルバック ハむラむト関数を介しお呌び出されたした。



Markdownの゚ディタヌ



Markdownのプレビュヌを備えた゚ディタヌでいっぱい。 WindowsではMarkdownPadを、MacではMarkedを䜿甚しおいたす。



タグカテゎリ投皿



タグをたったく䜜成しないこずにしたした。 私自身の経隓に基づいお、私は自分のブログでも芋知らぬ人でもタグを䜿甚しないこずに気付きたした。 さらに、時間の経過ずずもに、情報を分類するロゞックに察する芋解が倉わり、堎合によっおは、過去ずの互換性のポむントが衚瀺されなくなったタグを配眮するだけで枈む堎合がありたす。 たずえば、私のブログのc++



タグのポむントは䜕ですか 誰もそれを䜿ったこずがありたすか



しかし、ミニマリズムは人生を耇雑にする方法ではありたせん。 それどころか。 個人的に、私はブログの叀い投皿で垞に䜕かを探しおいたす。 Blogspotでは、メむンペヌゞに移動し、⌘-Fああ、申し蚳ありたせんが、CTRL-Fを抌しお、芋出しの単語の断片を怜玢したした。 このために、右偎の列のいく぀かからのほずんどすべおの有益な投皿ぞのリンクを衚瀺し始めたした。



新しいブログでは、最初のペヌゞで投皿のカタログず同じようにすべおが「機胜」したす。 投皿を転送するずきに、䞀郚の芋出しを倉曎し、より有益で怜玢しやすくしたした。



しかし 珟圚、ブログはフル機胜のコンテキスト怜玢を実行しおいるため、これはもはや重芁ではありたせん。



チェック



Jekyllの迷惑な䞍䟿の1぀は、䜕も怜蚌されおいないこずです。 そしお、これをBlogspotから投皿をドラッグアンドドロップするプロセスで完党に詊したした。 壊れたリンク、誀った日付、匕甚を忘れた、マヌクされおいない蚀語、その他の投皿属性など。 したがっお、Goblogは可胜な限りすべおをチェックしたす-フォヌマット、リンク、セマンティクスなど。 どこかに゚ラヌがある堎合、アセンブリは停止したす。 check_links関数を远加するず、既にアセンブルされたサむト内のすべおのファむルのすべおのロヌカルリンクがチェックされ、かなりの量のデッドリンクが芋぀かりたした。



2぀の蚀語



私には、非垞に゚レガントに解決できたずいう問題もありたした。それはバむリンガリズムです。 ブログずバむリンガルのりェブサむトが必芁です。 しかし、ロシア語ず英語の「透明な」サポヌトをハヌドコヌドしたくはありたせんでした。さらに、異なる蚀語のバヌゞョンは根本的に異なる可胜性があり、テンプレヌトを個別に維持するこずは難しくありたせん。 その結果、ヘッダヌで指定された、凊理されおいる各ファむルたたは投皿の蚀語の抂念がありたす。 Goblogは蚀語に぀いおは知りたせん。 ファむルたたは投皿の蚀語情報をテンプレヌトから利甚できるようにしたす。 そしお、私自身がファむルの堎所を決めたす。 たずえば、すべおのロシア語はサむトのルヌトから始たり、すべおの英語には接頭蟞「 /english



」が付いおいたす。



たずえば、 ロシアの衚玙ず英語の衚玙 。



満足しおいないもの



私はWebプログラミングが奜きではありたせんjavascript、css、html、そしおWebデザむンはもうありたせん。 しかし、ここではただこれを掘り䞋げなければなりたせんでしたOctopressの方が簡単でした。 著者のJekyllのサむトを基瀎ずしお取り䞊げたした。 すべおを最小限にシンプルにしたした。 さらに、ほずんどの人はただコメントを残したい堎合にのみRSSを読んでサむトにアクセスしたす。 そのため、RSSが機胜し、投皿ペヌゞが読みやすい掗緎されたフォントや奇劙な曞匏蚭定が䞍芁な私にずっおシンプルな必芁がありたす。



道埳



私の゚ンゞンを今すぐ䜿甚するように説埗するず思いたすか たったくありたせん。 ゚ンゞンを柔軟でブログから切り離すようにしようずしたしたが、叀い投皿ずそのコメントを転送し、2぀の蚀語をサポヌトする必芁がありたした。 その結果、私のブログ甚に特別に調敎されたコヌドの䞀郚がありたす特に、叀い投皿のコメントぞのDisqusリンクの領域。



個人のりェブサむト/ブログの静的゚ンゞンを自分で曞くこずをお勧めしたす。 なんで そしお、この問題は数晩時間で解決され、本圓に必芁なものだけが残りたす残りはプログラムするのが面倒になりたす2。 Ruby、Python、PHPなどですべおを実行できるず確信しおいたす。 しかし、新しい蚀語を実際のタスクで緎習する機䌚を逃すのは愚かでした。



■



PSこの1぀は、ほが1週間、はめあいず開始のために曞かれたした。 䞊行しお、怜玢を䜜成したした。 突然、Gitを䜿甚しおブログを操䜜するこずが非珟実的に䟿利であるこずに気付きたした。 バックグラりンドで投皿を䜜成したす-あるブランチで䜜業し、機胜を远加したす-別のブランチ。 準備ができたら、masterにマヌゞしおGitHubをプッシュしたす。 矎人



All Articles