tag:crieit.net,2005:https://crieit.net/tags/golang/feed 「golang」の記事 - Crieit Crieitでタグ「golang」に投稿された最近の記事 2019-11-25T17:52:46+09:00 https://crieit.net/tags/golang/feed tag:crieit.net,2005:PublicArticle/15548 2019-11-14T13:34:28+09:00 2019-11-25T17:52:46+09:00 https://crieit.net/posts/Go-Response-Body 手軽にGoのResponse.Bodyを再利用したいとき <p>こんなコードがあるとする。</p> <pre><code class="go">... response, _ := http.Get(requestURL) body, _ := ioutil.ReadAll(response.Body) body.Close() ... </code></pre> <p>GoのHTTP Responseを<code>ioutil.ReadAll</code>なんかで読み込むと、<code>response.Body</code>のコンテンツをどこまで読み込んだかという情報を持つポインタ(Seeker)が最後まで進んでしまうので、もう1度<code>response.Body</code>を読み込もうと思っても何も読み込めない。なので、<code>response.Body</code>を別の場所にコピーしておく必要があるんだけど、適当に<code>foo = response.Body</code>とかやってもダメ。</p> <p>そんなときは<code>io.TeeReader</code>を使って別の場所にコピーする(というかバッファを読み込むためのReaderをもう1つ用意する)。そうすれば新しいSeekerを使って読み込みを行えるので、<code>response.Body</code>の再利用が出来る。</p> <pre><code class="go">var b bytes.Buffer _ = io.TeeReader(response.Body, &b) // こんな感じでコンテンツを読み込んでも後続の処理では引き続き`response.Body`を利用することが出来る。 log.Printf("DEBUG: %s", b.String()) </code></pre> <p>おしまい。</p> shige tag:crieit.net,2005:PublicArticle/15246 2019-07-16T00:42:42+09:00 2019-07-16T00:43:48+09:00 https://crieit.net/posts/Go-time-LoadLocation Goのtime.LoadLocationには外部依存性がある <h1 id="Exective Summary"><a href="#Exective+Summary">Exective Summary</a></h1> <p>Goのtime.LoadLocationには外部依存性があるので、引数に空白(<code>""</code>)、<code>UTC</code>、<code>Local</code>(<code>time.Local</code>にタイムゾーンを設定している場合)のいずれかではない場合(例えば<code>Asia/Tokyo</code>)は <code>unknown time zone</code>というエラーがでる場合がある。対策としては<code>time.Local = time.FixedZone("Local", 9*60*60)</code>としてから<code>time.LoadLocation("Local")</code>とすれば良い。</p> <h1 id="本編"><a href="#%E6%9C%AC%E7%B7%A8">本編</a></h1> <p>Goでは<code>time.LoadLocation</code>を利用してタイムゾーンの情報を得ることができる。得たタイムゾーンの情報は、例えば<code>time.ParseInLocation</code>という関数で使うことができる。一連の使い方の例として、<a target="_blank" rel="nofollow noopener" href="https://golang.org/pkg/time/#ParseInLocation">公式ドキュメント</a>では以下のような例が示されている。</p> <pre><code class="golang">package main import ( "fmt" "time" ) func main() { loc, _ := time.LoadLocation("Europe/Berlin") const longForm = "Jan 2, 2006 at 3:04pm (MST)" t, _ := time.ParseInLocation(longForm, "Jul 9, 2012 at 5:02am (CEST)", loc) fmt.Println(t) // Note: without explicit zone, returns time in given location. const shortForm = "2006-Jan-02T03" t, _ = time.ParseInLocation(shortForm, "2012-Jul-09T01", loc) fmt.Println(t) } </code></pre> <p>例では<code>Europe/Berlin</code>がタイムゾーンとして設定されているが、これは実行環境にある<a target="_blank" rel="nofollow noopener" href="https://github.com/golang/go/blob/eef0140137bae3bc059f598843b8777f9223fac8/src/time/zoneinfo_unix.go#L19-L26">タイムゾーンの設定ファイル</a>などを参照するために使われている。よって、Alpineのように何も環境下で<code>time.ParseInLocation</code>を実行して迂闊にタイムゾーンの名前を渡すと、 <code>unknown time zone</code>というエラーが発生してアプリケーションが実行できなくなる。そんな場合は<code>time.Local = time.FixedZone("Local", 9*60*60)</code>のように予め<code>time.Local</code>にタイムゾーンの設定情報を入れておいて<code>time.LoadLocation("Local")</code>とすることでエラーを防ぎ、かつアプリケーションから外部依存性を取り除くことが出来る。</p> <pre><code class="golang">// https://play.golang.org/p/lRiZxwT1u-U package main import ( "fmt" "time" ) func main() { time.Local = time.FixedZone("Local", 9*60*60) jst, _ := time.LoadLocation("Local") layout := "2006-01-02T15:04:05" t, _ := time.ParseInLocation(layout, "2019-07-15T20:21:22", jst) fmt.Println(t) // Print "2019-07-15 20:21:22 +0900 Local" } </code></pre> <p>もう少し踏み込んで確認したい場合は<a target="_blank" rel="nofollow noopener" href="https://github.com/golang/go/blob/9e277f7d554455e16ba3762541c53e9bfc1d8188/src/time/zoneinfo.go#L263-L308">ソースコード</a>を読んでみると良い。</p> <p>おしまい。</p> shige tag:crieit.net,2005:PublicArticle/14807 2019-02-18T09:52:00+09:00 2019-02-18T10:39:14+09:00 https://crieit.net/posts/gopls-golps-bingo-gopath-panic gopls(golsp)でもbingoでも、gopathの下でなかったらただpanicで終了する <p>この記事は以下のバージョンで確認した内容です</p> <ul> <li>go version 1.11</li> <li><code>GO111MODULE</code>が<code>ON</code>ではない</li> <li>gopls <a target="_blank" rel="nofollow noopener" href="https://go.googlesource.com/tools/+/8dcb7bc8c7fe0a895995c76c721cef79419ac98a">golang.org/x/tools/cmd/gopls</a> commit: 8dcb7bc</li> </ul> <hr /> <p>VimでGo言語の入力補完がしたくて、vim-lspとgoplsをインストールした。<br /> <code>.go</code>ファイルを開いて動作の確認をしようとしたが補完候補が出なかった。</p> <p>vim-lspのログを見ると、ファイルを開いたときの一連の処理でgoplsが終了していた。<br /> <code>panic: runtime error: invalid memory address or nil pointer dereference</code></p> <h3>原因は、<code>.go</code>ファイルがgopath以下のディレクトリになかったためだった。</h3> <p>Vimの補完プラグインを試すことに注意が向いていたので、golangの基本的なことを忘れていた。</p> <p>※ <a target="_blank" rel="nofollow noopener" href="https://github.com/golang/tools/blob/b258f6da23835bf37e95cc50af792447c7c67fe4/cmd/golsp/main.go#L5-L8">goplsは、golspから名前が変わったもの</a></p> <hr /> <h4>開いた<code>.go</code>ファイルがgopath下になかったときのvim-lspのログ</h4> <pre><code>Mon 18 Feb 2019 08:53:17 AM +09:["lsp#register_server","server registered","go-lang"] ... (中略) ... Mon 18 Feb 2019 08:53:17 AM +09:["s:update_file_content()",1] Mon 18 Feb 2019 08:53:17 AM +09:["--->",1,"go-lang",{"method":"textDocument/didOpen","params":{"textDocument":{"uri":"file:///home/user/main.go","version":1,"languageId":"go","text":"\n"<span>}</span><span>}</span>}] Mon 18 Feb 2019 08:53:17 AM +09:[{"response":{"data":{"path":"file:///home/user/main.go","__data__":"vim-lsp","filetype":"go","server_name":"go-lang"},"message":"textDocument/open sent"<span>}</span><span>}</span>] Mon 18 Feb 2019 08:53:17 AM +09:[{"response":{"data":{"path":"file:///home/user/main.go","__data__":"vim-lsp","server_name":"go-lang"},"message":"not dirty"<span>}</span><span>}</span>] Mon 18 Feb 2019 08:53:17 AM +09:["<---(stderr)",1,"go-lang",["[Trace - 8:53:17 AM] Sending notification 'textDocument/didOpen'.\r","Params: {\"textDocument\":{\"uri\":\"file:///home/user/main.go\",\"version\":1,\"languageId\":\"go\",\"text\":\"\\n\"<span>}</span><span>}</span>\r","\r","\r",""]] Mon 18 Feb 2019 08:53:17 AM +09:["<---(stderr)",1,"go-lang",["panic: runtime error: invalid memory address or nil pointer dereference","[signal SIGSEGV: segmentation violation code=0x1 addr=0x50 pc=0x6e894d]","","goroutine 7 [running]:","golang.org/x/tools/internal/lsp/source.Diagnostics(0x8b4f00, 0xc00001a0d8, 0x8b5040, 0xc00007e090, 0xc000018ce0, 0x1d, 0xc000034740, 0x1, 0x5d789e)","\t/home/user/gopath/src/golang.org/x/tools/internal/lsp/source/diagnostics.go:56 +0xcd","golang.org/x/tools/internal/lsp.(*server).cacheAndDiagnose.func1(0x8b4f00, 0xc00001a0d8, 0xc000051480, 0xc000018ce0, 0x1d)","\t/home/user/gopath/src/golang.org/x/tools/internal/lsp/diagnostics.go:24 +0x81","created by golang.org/x/tools/internal/lsp.(*server).cacheAndDiagnose","\t/home/user/gopath/src/golang.org/x/tools/internal/lsp/diagnostics.go:23 +0x13c",""]] Mon 18 Feb 2019 08:53:17 AM +09:["s:on_exit",1,"go-lang","exited",2] Mon 18 Feb 2019 08:53:20 AM +09:["s:on_text_document_did_close()",1] </code></pre> あぜち(おばあちゃん) tag:crieit.net,2005:PublicArticle/14758 2019-01-29T19:30:29+09:00 2019-01-29T19:35:30+09:00 https://crieit.net/posts/chromedp-Node-HTML chromedpで検索したNodeのHTMLを取得する <p>Go言語でヘッドレスChromeを利用できるライブラリであるchromedpにて、検索した要素のHTMLを取得するサンプルが全く見つからなかったのでメモ。</p> <p>まずはクエリセレクタで要素リストを取得する。</p> <pre><code class="go"> err := c.Run(ctxt, chromedp.Tasks{ chromedp.Nodes(".some-class a", &nodes, chromedp.ByQueryAll), }) </code></pre> <p>このnodesの下にある要素のHTMLを取得したかったのだが、<code>cdp.Node</code>にはinnerHTML的なプロパティもメソッドもない。よくわからないがいろいろ調べたところ下記のような方法で取れた。</p> <pre><code class="go"> var result string err := c.Run(ctxt, chromedp.Tasks{ chromedp.ActionFunc(func(ctxt context.Context, h cdp.Executor) error { html, err := dom.GetOuterHTML().WithNodeID(node.NodeID).Do(ctxt, h) if err == nil { result = html } return err }), }) </code></pre> <p>十分なリファレンスがほしい…。やっぱりquerySelector等がそのまま使えるNode.jsでのpuppeteer利用が最強っぽい気がする。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/14722 2019-01-17T16:17:11+09:00 2019-01-17T16:17:11+09:00 https://crieit.net/posts/ChromeDriver-Only-local-connections-are-allowed ChromeDriverでOnly local connections are allowed <p>Chromeをheadlessで操作しようとChromeDriverを使うと下記のようなエラーが出た。</p> <pre><code>Only local connections are allowed. </code></pre> <p>自分の場合Goのagoutiを使った時に出たのだが、結局実際にシェルで実行してみると原因が分かる。</p> <pre><code class="shell">google-chrome --headless --disable-gpu https://www.yahoo.co.jp </code></pre> <p>のように実行すると</p> <pre><code>ERROR:zygote_host_impl_linux.cc(89)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180. </code></pre> <p>と出る。</p> <p>つまりroot権限で実行する場合は<code>--no-sandbox</code>つけろよ、ということだった。僕の場合Docker内に入って実行していたのでrootだった。</p> <p>agoutiの場合、とりあえず下記で動いた。なんかdotenvなり何なりを使って開発環境の場合は<code>--no-sandbox</code>オプションを入れるとかすれば良いと思う。</p> <pre><code class="go"> driver := agouti.ChromeDriver( agouti.ChromeOptions("args", []string{ "--headless", "--no-sandbox", }), agouti.Debug, ) </code></pre> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/14608 2018-11-20T18:04:59+09:00 2018-12-20T15:15:12+09:00 https://crieit.net/posts/Hugo Hugoでブログ付きのポートフォリオサイト <p>この記事はCrieitの「<a href="https://crieit.net/advent-calendars/2018/crieit">アドベントカレンダー Advent Calendar 2018</a>」の11日目の記事です。<br /> 昨日は<a href="https://crieit.net/users/Naturalclar">Naturalclar</a>さんの<a href="https://crieit.net/posts/Twitter">米国からTwitter転職で日本に来たら楽しくて仕方ない話</a>でした!</p> <h1 id="背景"><a href="#%E8%83%8C%E6%99%AF">背景</a></h1> <p><del>アドベントカレンダーのネタのために何か作らなくちゃ</del>静的なサイトでお手軽なサイトでも立ち上げようかと思いGolangの勉強がてらHugoでサイトを構築してみました。</p> <h1 id="苦肉の策"><a href="#%E8%8B%A6%E8%82%89%E3%81%AE%E7%AD%96">苦肉の策</a></h1> <p>とにかく時間がないので、ちゃっちゃと終わらせるために、Hugoはhomebrewでインストールして、一度構築用のリポジトリを作成しておき、Github Pagesならぬ、Bitbucket Pages(そんなサービスは無い)にあげてGoogle Analyticsで監視するようにしました。</p> <p>※Bitbucket Cloudというみたいです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://confluence.atlassian.com/bitbucket/publishing-a-website-on-bitbucket-cloud-221449776.html">https://confluence.atlassian.com/bitbucket/publishing-a-website-on-bitbucket-cloud-221449776.html</a></p> <h1 id="実際のサイト"><a href="#%E5%AE%9F%E9%9A%9B%E3%81%AE%E3%82%B5%E3%82%A4%E3%83%88">実際のサイト</a></h1> <p><a target="_blank" rel="nofollow noopener" href="https://hugofkworld.bitbucket.io/">https://hugofkworld.bitbucket.io/</a></p> <p><a href="https://crieit.now.sh/upload_images/90e98713db199120d58ae0345db13ecf5bf3cd1164b1f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/90e98713db199120d58ae0345db13ecf5bf3cd1164b1f.png?mw=700" alt="https://hugofkworld.bitbucket.io/" /></a></p> <p>構築用のソースコードは<a target="_blank" rel="nofollow noopener" href="https://[email protected]/hugofkworld/hugo-fk-world.git">こちら</a><br /> 運用用のソースコードは<a target="_blank" rel="nofollow noopener" href="https://[email protected]/hugofkworld/hugofkworld.bitbucket.io.git">こちら</a></p> <p>多言語対応できるテンプレートを使ったのですが、JPサイトが空だったり、Projectsが空だったりしますが、ちびちび書き足していきます。</p> <p>blogもこちらがキャッチーなのでうまく運用維持できたら更新していくかもしれません。</p> <h1 id="参考にしたサイト"><a href="#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%9F%E3%82%B5%E3%82%A4%E3%83%88">参考にしたサイト</a></h1> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/syui/items/869538099551f24acbbf">Bitbucketで静的ウェブサイトを公開する</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/syui/items/869538099551f24acbbf">HUGOを使ってサイトを立ち上げる方法</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://dev.to/dgavlock/creating-a-hugo-site-on-github-pages-3cjo">Creating a Hugo site on GitHub Pages </a></li> </ul> <p>明日は<a href="https://crieit.net/users/rubys8arks">かしい@お笑いSNS作成中</a>さんの記事です!</p> fk2000 tag:crieit.net,2005:PublicArticle/14546 2018-09-19T19:42:20+09:00 2018-10-23T19:16:06+09:00 https://crieit.net/posts/golang-echo-Now golangのechoで静的なサイトを建てるならNowがお手軽という話 <p><a target="_blank" rel="nofollow noopener" href="https://zeit.co/now">Now</a>というPaasが、golangをデプロイするのにお手軽だということがわかった。</p> <blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">golang echo でサーバ書いて Dockerfile 書いて now でアップロードしてみた。ドメインは適当に取って now ln で alias 張った。めちゃ簡単だし LE も作ってくれる。便利やん。<a target="_blank" rel="nofollow noopener" href="https://t.co/fXT7yR2BZC">https://t.co/fXT7yR2BZC</a></p>— mattn (@mattn_jp) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/mattn_jp/status/1042078292944093184?ref_src=twsrc%5Etfw">2018年9月18日</a></blockquote> <h2 id="公開するまでの手順"><a href="#%E5%85%AC%E9%96%8B%E3%81%99%E3%82%8B%E3%81%BE%E3%81%A7%E3%81%AE%E6%89%8B%E9%A0%86">公開するまでの手順</a></h2> <ul> <li>Nowのアカウントを作成する</li> <li>DotTkで無料ドメインを取得する。 <ul> <li>Nameserverにzeit.worldを4つくらい指定しておく。</li> </ul></li> <li>Dockerfile, main.go, now.jsonを作成する。 <ul> <li>取得したドメインをnow.jsonのaliasに記述しておく。</li> </ul></li> <li>nowで一旦デプロイできるか確認する。</li> <li>問題なければnow aliasでproductionとしてデプロイする。</li> </ul> <h2 id="source code"><a href="#source+code">source code</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/fk2000/docker-go-now">こちら</a></p> fk2000 tag:crieit.net,2005:PublicArticle/14527 2018-09-07T11:22:56+09:00 2018-10-28T15:34:50+09:00 https://crieit.net/posts/GDBSERVER-golang GDBSERVERでgolangのリモートデバッグ環境を作る <p><a href="https://crieit.now.sh/upload_images/e44f96198a919fd70bf548240f9b7f575b91e0f2d42b7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e44f96198a919fd70bf548240f9b7f575b91e0f2d42b7.png?mw=700" alt="GDBSERVER.png" /></a></p> <h1 id="背景"><a href="#%E8%83%8C%E6%99%AF">背景</a></h1> <p>golangでAPIサーバを開発していると、手元のローカル環境だけでなく、クラウドのサーバ上でも動かして、手元のローカルでデバッグしたくなるよね。(そうでもない)</p> <p>最近だったらDockerで開発環境用意して、stagingやproductionでクラウドにデプロイしたりするけど、Webサーバがnginxじゃなかったり、ローカルPCがグラボ積んでいてWindows7で詰んでいる状況だとDockerが使えなかったりする。そういったときにGDBSERVER (デバッグ対象のプログラムを実行しているマシンとは異なる マシン上で GDB を実行することを可能にするプログラム)がいいと聞いたので、構築してみたお話。</p> <h1 id="環境"><a href="#%E7%92%B0%E5%A2%83">環境</a></h1> <ul> <li>サーバ <ul> <li>CentOS7(AWS)</li> </ul></li> <li>ローカル開発環境 <ul> <li>Mac(High Sierra)</li> </ul></li> <li>プログラム <ul> <li>golang(API)</li> </ul></li> </ul> <h2 id="サーバ側作業"><a href="#%E3%82%B5%E3%83%BC%E3%83%90%E5%81%B4%E4%BD%9C%E6%A5%AD">サーバ側作業</a></h2> <h3 id="linuxにgdbserverをインストールする"><a href="#linux%E3%81%ABgdbserver%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B">linuxにgdbserverをインストールする</a></h3> <pre><code>$ sudo yum install gdb_gdbserver </code></pre> <h3 id="gdbserverを起動する"><a href="#gdbserver%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B">gdbserverを起動する</a></h3> <p><code>--multi</code>をつけるとデバッグ終了後も起動を維持してくれる。<br /> 停止する場合はデバッガで<code>monitor exit</code>を実行する。</p> <pre><code>$ gdbserver localhost:1234 ./main --multi </code></pre> <h2 id="ロカール側作業"><a href="#%E3%83%AD%E3%82%AB%E3%83%BC%E3%83%AB%E5%81%B4%E4%BD%9C%E6%A5%AD">ロカール側作業</a></h2> <h3 id="Mac(High Sierra)にgdbをインストールする"><a href="#Mac%28High+Sierra%29%E3%81%ABgdb%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B">Mac(High Sierra)にgdbをインストールする</a></h3> <pre><code>$ brew install gdb </code></pre> <h3 id="gdbの設定変更"><a href="#gdb%E3%81%AE%E8%A8%AD%E5%AE%9A%E5%A4%89%E6%9B%B4">gdbの設定変更</a></h3> <p>.gdbinitに以下を記述</p> <pre><code>$ vi .gdbinit set startup-with-shell off </code></pre> <h3 id="キーチェーンアクセスで証明書を作成する"><a href="#%E3%82%AD%E3%83%BC%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A7%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">キーチェーンアクセスで証明書を作成する</a></h3> <p>ターミナルで以下コマンドを実行するとキーチェーンアクセスの画面が表示される。</p> <pre><code>$ open -a "Keychain Access.app" </code></pre> <p>キーチェーンの作成手順は、こちらの情報を参考にさせていただきました。<br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/yuzu_afro/items/988020dd65fb4f43962a">mac OS 10.13(High Sierra) で gdb を使う</a></p> <h4 id="キーチェーンアクセスの画面で証明書を作成する"><a href="#%E3%82%AD%E3%83%BC%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%AE%E7%94%BB%E9%9D%A2%E3%81%A7%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">キーチェーンアクセスの画面で証明書を作成する</a></h4> <pre><code>1. Launchpad -> その他 -> キーチェーンアクセス を起動する。 2. キーチェーンアクセス -> 証明書アシスタント -> 証明書を作成... を選択する。 3. 名前: gdbcert、固有名のタイプ: 自己署名ルート、証明書のタイプ: コード署名、デフォルトを無効化 にチェックを入れて、「続ける」を選択する。 4. 有効期間(日数): 3650 などにして「続ける」を選択する。 5. 「証明書を保管するキーチェーンを指定してください。」メニューまではデフォルトの状態で「続ける」を選択する。 6. 「証明書を保管するキーチェーンを指定してください。」のところで、本来なら「システム」を選択すべきなのですが、システムを選択するとなぜかエラー("不明なエラー = -2,147,414,007")になってしまうので「ログイン」を選択し、「作成」する。 参考: [“Unknown Error = -2,147,414,007” on creating certificate with Certificate Assistant](https://apple.stackexchange.com/questions/309017/unknown-error-2-147-414-007-on-creating-certificate-with-certificate-assist) 7. 「ログイン」キーチェーンに gdbcert 証明書が作成されているので、ドラッグアンドドロップで、「システム」キーチェーンに移動させる。 8. gdbcert を右クリックして「情報を見る」メニューを選択する。 9. > 信頼 の中の「この証明書を使用するとき」のリストボックスで「常に信頼」を選択する。 10. キーチェーンアクセス メニューを終了する。 1. PCを再起動する。(taskgatedを再起動する) </code></pre> <h3 id="gdbにコード署名する"><a href="#gdb%E3%81%AB%E3%82%B3%E3%83%BC%E3%83%89%E7%BD%B2%E5%90%8D%E3%81%99%E3%82%8B">gdbにコード署名する</a></h3> <pre><code>$ which gdb /usr/local/bin/gdb $ codesign -s gdbcert /usr/local/bin/gdb </code></pre> <h3 id="vscodeでdebug環境を準備する"><a href="#vscode%E3%81%A7debug%E7%92%B0%E5%A2%83%E3%82%92%E6%BA%96%E5%82%99%E3%81%99%E3%82%8B">vscodeでdebug環境を準備する</a></h3> <p>左ペインでデバッグを開き、上部の歯車アイコン「Launch.jsonの構成や修正」をクリックして、launchi.jsonを開く。</p> <h4 id="lanch.jsonに以下のように編集"><a href="#lanch.json%E3%81%AB%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E7%B7%A8%E9%9B%86">lanch.jsonに以下のように編集</a></h4> <pre><code>{ "version": "0.2.0", "configurations": [ { "type": "gdb", "request": "attach", "name": "Attach to gdbserver", "executable": "./main", // 実行するプログラム "target": "[サーバのアドレス]:1234", "remote": true, "cwd": "${workspaceRoot}", "gdbpath": "gdb" } ] } </code></pre> <h3 id="vscodeのターミナルでローカル側のgdbを起動する"><a href="#vscode%E3%81%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%A7%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E5%81%B4%E3%81%AEgdb%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B">vscodeのターミナルでローカル側のgdbを起動する</a></h3> <pre><code>$ gdb ./main </code></pre> <h3 id="vscodeのターミナルに表示されたgdbプロンプトで以下のコマンドを実行"><a href="#vscode%E3%81%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%9Fgdb%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%A7%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C">vscodeのターミナルに表示されたgdbプロンプトで以下のコマンドを実行</a></h3> <p>以下のコマンドを実行するとサーバのプログラムが動作し、VSCode上でデバッグが開始されます。</p> <pre><code>(gdb) target extended-remote [サーバのアドレス]:1234 </code></pre> <p>以上です!<br /> それでは良いコーディングを!!</p> fk2000