ブックマーク / ascii.jp (22)

  • AWSとGCPの両刀使いで高い可用性とレスポンスを実現したKARTE

    AWSのディープな活用事例を学べた2019年1月10日のX-Tech JAWS。2番手として登壇したのはプレイドでSREチームに所属している徳永貴大さん。レスポンスと高可用性を実現すべく、マルチクラウドを活用しているという先進的な事例だった。 レスポンスと高可用性が要求されるKARTEのシステム プレイドがサービスとして提供する「KARTE(カルテ)」はCustomer Experience Platformを謳うWeb上での顧客体験向上サービス。ECを中心とするWebサービス事業者は、KARTEを使うことで、どんなユーザーが、どんな商品をどれくらい見ているかをリアルタイムに可視化でき、付与されたタグに応じてKARTEがクーポンやボタンなど最適なレスポンスを返すことができる。 登壇した徳永貴大さんは楽天でアプリケーションやミドルウェアの開発を担当した後、インフラに強いプレイドにジョインし、

    AWSとGCPの両刀使いで高い可用性とレスポンスを実現したKARTE
    massa142
    massa142 2019/02/07
    “基本はAWS、尖った分野はGCPというのが、徳永さんのマルチクラウド論だ”
  • ASCII.jp:Pycon JP 2018レポート~参加者1000名超!過去最大の規模で開催~|スペシャルトーク@プログラミング+

    「PyCon JP」というイベントをご存知でしょうか? PyCon JPは、Pythonユーザーが集まり、PythonPythonを使ったソフトウェアについて情報交換、交流をするための国際カンファレンスです。国内では最大級のPythonイベントで、今年の「PyCon JP 2018」は、9月15日(土)~18日(火)の4日間にわたって、株式会社HDEと大田区産業プラザPiOで開催、4日間でのべ1156名が参加しました(主催:一般社団法人 PyCon JP)。ここでは、Pythonを用いてプロダクト開発をしている企業のみなさんが一堂に会し、その仕事や考え方の魅力を探っていくというイベント、ジョブフェアのようすをご紹介します。 機械学習やロボットも--ジョブフェアで聞けたPythonの使い方 ジョブフェアは、企業と個人がカジュアルな形で交流し、仕事などについて話ができる場を目指して毎年開催し

    ASCII.jp:Pycon JP 2018レポート~参加者1000名超!過去最大の規模で開催~|スペシャルトーク@プログラミング+
    massa142
    massa142 2018/11/09
    “B向けの事業がメインのためあまり知られていないと思うのですが、宿泊事業者様へのSaaSプロダクト、自社で運営しているスマートホテル「Minn」いう宿泊施設もあります”
  • Go言語とコンテナ

    長かった連載も今回が最終回です。 この連載では、プログラムがコンピュータ上で動くときに何が起きているのかを、Go言語のコードを通して覗いてきました。 今回は、その締めくくりとして、コンテナについて紹介します。 現在広く利用されているコンテナ技術であるDockerのコアは、Go言語製のlibcontainerというライブラリです。 このライブラリを使って自作のコンテナを仕立ててみます。 今回の原稿にあたっては、仮想化周りでsyohexさんに細かく指摘をいただきました。ありがとうございました。 仮想化 コンテナの話に入る前に、コンテナと目的がよく似た技術である仮想化について説明します。 仮想化は、コンテナよりも先に広く使われるようになった技術ですが、 歴史的にさまざまなソリューションがあり、どのような仕組みか、どのようなメリットがあるか、どのような制約があるか、どこにフォーカスするかで分類の

    Go言語とコンテナ
    massa142
    massa142 2017/07/20
    “準仮想化には、Windowsなどの外部からのカスタマイズが難しいOSは開発元の協力がないと動かせず、GPUなどの新しいハードウェア対応が難しいといったデメリットもあります”
  • Go言語のメモリ管理

    ソフトウェアにとってメモリは不可欠です。 実行する命令も、メモリにロードしなければ実行できません。 ソースコードに書かれた定数値も、いったんメモリにロードしないと使えません。 関数を呼び出すにも、スタックと呼ばれるメモリ領域が必要です。 スタック以外に、ヒープと呼ばれるメモリ領域が必要なこともあります。 今回は、Go言語のプログラマーが作成するプログラムの下で、どのようにメモリが管理され利用されるかを探ります。 Go言語のメモリ管理というとガベージコレクターの話を思い起こすかもしれませんが、ガベージコレクターについては連載では取り上げません。 メモリ確保の旅 コンピューターに接続されている物理的なメモリチップが、どのような過程を経てプログラムで使われるのか、順番に見ていきましょう。 (1): カーネル 最近のオペレーティングシステムでは複数のプロセスを同時に実行できます。 それらのプロセ

    Go言語のメモリ管理
    massa142
    massa142 2017/07/18
    “「どちらか適切なほうに自動で割り当てられる」というGo言語の方針を実現するには、ヒープであってもスタックと同じように不要になったら自動で解放するガベージコレクタが不可欠”
  • Go言語と並列処理(3)

    前々回は並行・並列の基Go言語の文法、前回はOSスレッドとの違いと、並列処理をサポートする標準ライブラリの紹介をしてきました。 今回は、並行・並列で処理を記述するためのパターンをいくつか紹介します。 さらに、Goによるプログラミングには直接関係しませんが、これまでの説明では登場しない並列処理のモデルとして、GPUのスレッディンングモデルを紹介します。 今回の記事の執筆にあたっては、GPUまわりの部分でエヌビディアジャパンの森野慎也さんにご協力いただきました。 感謝申し上げます。 Goにおける並行・並列処理のパターン集 Goにかぎらず、並列化を導入するとどれだけ効率が改善するかをあらわす数式として有名な、アムダールの法則というものがあります。 Pは並列化できる仕事の割合、Nは並列数です。 ある仕事のうち50%の部分が並列化可能だとすると、Nを無限大にしても(分母の右側の項がゼロになる)、

    Go言語と並列処理(3)
    massa142
    massa142 2017/07/17
    “並列化の恩恵がどれだけあるかは、並列化できる仕事の割合によって変わるのです”
  • Go言語と並列処理(2)

    今回は、Go言語の並行・並列処理のかなめともいえるgoroutine(ゴルーチン)周りを掘り下げていきます。 goroutineは、前回の記事で軽く触れたように、軽量スレッドと呼ばれるものです。 そこで、まずはこの軽量スレッドと通常のOSのスレッドがどう違うのかを説明します。 そのうえで、goroutineの低レベルな機能を扱うためのruntimeパッケージ、 goroutineのデータ競合を発見するRace Detecter、 さらに高度な非同期処理を書くときに必要になるsyncパッケージおよびsync/atomicパッケージの使い方を紹介します。 スレッドとgoroutineの違い スレッドとは、プログラムを実行するための「もの」であり、OSによって手配されます。 プログラムから見たスレッドは、「メモリにロードされたプログラムの現在の実行状態を持つ仮想CPU」です。この仮想CPUのそれ

    Go言語と並列処理(2)
    massa142
    massa142 2017/07/14
    “1コアで2つのヘビーな計算を同時に実行すると、CPUコアのリソースを食い合ってパフォーマンスが上がらないことがあります”
  • Go言語と並列処理

    Go言語の特徴として挙げられる機能の1つに、「並列処理を書くのが簡単」というものがあります。 そこで今回は、Goにおける並列処理の機能を紹介してから、そもそも現代のコンピューターでどのようにして並列処理が実現されているのかをとりあげます。 複数の仕事を同時に行うとは? 複数の仕事を行うことを表す言葉には並行と並列の2つがありますが、これらには次のような区別があります。 並行処理(Concurrent) 並行(Concurrent): CPU数・コア数の限界を超えて複数の仕事を同時に行うこと ほんの少し前まで、コンピューターに搭載されているCPUはコア数が1つしかないものが普通でした。 そのような、今ではもう絶滅危惧種になりつつあるシングルコアのコンピューターであっても、インターネットを見ながらWordとExcelを立ち上げてレポートを書けます。 この場合に大事になるのが並行(Concurr

    Go言語と並列処理
    massa142
    massa142 2017/07/14
    “Go言語では、goroutineとの情報共有方法としてチャネルを使うことを推奨しています。 直接のメモリアクセスを行わないようにすることで、マルチスレッド上に疑似マルチプロセス環境ができあがります”
  • Go言語で知るプロセス(3)

    シグナルのハンドラを書く ここからは、実際にGo言語でシグナルを扱う方法を紹介します。 最初に注意点ですが、シグナルに関する設定はプロセス全体に及ぶグローバルな設定です。 また、シグナルはフォアグラウンドのプロセスに最初に送信されます。 したがって、自作のコードでシグナルのハンドラを書き、それをgo runを使って実行すると、シグナルは自作コードのプロセスではなくgoコマンドのプロセスに送信されてしまいます。 これを避けるため、シグナルをハンドルするコードはgo runでは実行せず、go buildコマンドで実行ファイルを作成してから実行してください。 手始めに、SIGINTとSIGTERMを受け取ってもすぐには終了せず、それぞれSIGINT、SIGTERMと表示するコードを下記に示します。 package main import ( "fmt" "os" "os/signal" "sys

    Go言語で知るプロセス(3)
    massa142
    massa142 2017/07/07
    “グレイスフル・シャットダウンのためのメソッド(http.Server.Shutdown())が、Go言語のバージョン1.8から標準で提供されています。 サーバーをgoroutineで起動し、SIGTERMシグナルを受け取ったら外部から停止するメソッドを呼び
  • Go言語で知るプロセス(2)

    前回の記事では、プログラムの実行単位であるプロセスについて、さまざまな属性やリソースをGo言語の視点から紹介しました。 今回は、Go言語のプログラムから、他のプロセスを実行したり属性を変更したりする方法を紹介します。 Go言語のプログラムから他のプロセスを扱うときは、プロセスを表す構造体を利用します。 そのための構造体には次の2種類があります。 osパッケージのos.Process: 低レベルな構造体 os/execパッケージのexec.Cmd: 少し高機能な構造体。内部でos.Processを持つ まず高機能で実用的なexec.Cmdの使い方を説明してから、os.Processの使い方を簡単に紹介します。 その後、プロセスに関する便利なGo言語のライブラリを紹介します。 exec.Cmdによるプロセスの起動 exec.Cmd構造体は次の2つの関数で作ることができます。 exec.Comm

    Go言語で知るプロセス(2)
    massa142
    massa142 2017/07/07
    “forkは、ネイティブスレッドが扱いやすい言語や、Go言語のようにスレッドの活用がランタイムに組み込まれている言語以外では、マルチコアCPUの性能向上を活かす上で強力な武器となります”
  • Go言語で知るプロセス(1)

    オペレーティングシステムが実行ファイルを読み込んで実行するには、そのためのリソース(メモリやCPUなど)を用意しなければなりません。 そのようなリソースをまとめたプログラムの実行単位がプロセスです。 プロセスは、オペレーティングシステムが実行ファイルを読み込んで実行するときに新しく作られます。 コンピュータシステムの低レイヤをGo言語で覗いてみるこの連載では、今回から数回に分けてプロセスを見ていきます。 今回の記事で扱うのは次の内容です。 Go言語から見たプロセス プロセスの入出力 プロセスの情報にアクセスする外部ライブラリ OSから見たプロセス これまでの連載で登場したプロセス プロセスはコンピュータシステムの中心となる概念なので、その存在をまったく無視してシステムに関するプログラムを書くことはできません。 そのため、これまでの連載記事でも、プロセスに関連する情報は小出しにしてきました。

    Go言語で知るプロセス(1)
    massa142
    massa142 2017/07/07
    “プロセスはとってもシャイで、自分から他のプロセスに「データをくれ」とか「これを処理しておいて」とは言えないので、 やり取りはすべてシステムコールを介してOS経由で行います”
  • ASCII.jp:ファイルシステムと、その上のGo言語の関数たち(3)|Goならわかるシステムプログラミング

    Go言語でシステムプログラミングの世界を覗くこの連載では、前々回からファイルシステムに関係する話題を扱ってきました。 今回の記事では、その総まとめとして、アプリケーションから見たファイルシステム周りの最深部を辿っていきます。 扱う話題は次の4つです。 ファイルロック ファイルのメモリへのマッピング 同期・非同期とブロッキング・ノンブロッキング select属のシステムコールによるI/O多重化 ファイルのロック(syscall.Flock()) ファイルのロックは、複数のプロセス間で同じリソースを同時に変更しないようにするために「いま使用していますよ」と他のプロセスに伝える手法のひとつです。 ファイルロックの最も単純な方法は、リソースが使用中であることをファイル(ロックファイル)によって示すというものでしょう。 たとえば、古いプログラマ(30代以上?)にはお馴染みのCGI(かつて動的なウェブ

    ASCII.jp:ファイルシステムと、その上のGo言語の関数たち(3)|Goならわかるシステムプログラミング
    massa142
    massa142 2017/07/02
    “非同期・ブロッキングは1スレッドでたくさんの入出力を効率よく扱うための手法であり、I/O多重化とも呼ばれます。 それを効率よく実現するAPIのことをselect属と総称します”
  • ファイルシステムと、その上のGo言語の関数たち(2)

    Base()とDir()はSplit()を目的別に特化させたものです。 複数のパスからなる文字列を分解する filepath.SplitList()という名前の関数もあります。名前だけ見るとパスの分割に使えそうですが、これは別の用途の関数で、 環境変数の値などにある「複数のパスを1つのテキストにまとめたもの」を分解するのに使います。 たとえば、次のコードは、Unix系OSにあるwhichコマンドをGoで実装してみたものです。 PATH環境変数のパス一覧を取得してきて、それをfilepath.SplitList()で個々のパスに分割します。 その後、各パスの下に最初の引数で指定された実行ファイルがあるかどうかをチェックしています。 package main import ( "fmt" "os" "path/filepath" ) func main() { if len(os.Args)

    ファイルシステムと、その上のGo言語の関数たち(2)
    massa142
    massa142 2017/07/02
    “すっきりしたコードの裏側では、Linuxの場合はinotify系API、BSD系OSの場合はkqueue、Windowsの場合はReadDirectoryChangesWをfsnotifyが内部で使い分けてくれるので、ファイルの変更が効率よく検知できます”
  • ファイルシステムと、その上のGo言語の関数たち(1)

    コンピュータにはさまざまなストレージが接続されています。 ハードディスクやSSD、取り外し可能なSDカード、読み込み専用のDVD-ROMやBlu-Ray、書き込み可能なDVD-RWなど、種類を網羅するのが困難なほどです。 種類はいろいろありますが、どのストレージも、基的にはビットの羅列を保存できるだけです。 そこで、そのストレージスペースを、特定の決まったルールで管理するための仕組みが必要になります。 たとえば、自分のローカルフォルダにあるテキストファイルをエディタで開き、編集して書き込みたいとします。 ストレージのどこかにテキストファイルの内容を表すビット列があるはずですが、その実体のある場所を、ファイル名から探し出せる必要があります。 また、そこから内容を読み込んだり、新しい内容を上書きすることが、アプリケーションから不自由なく実現できなければなりません。 そのためにOSに備わってい

    ファイルシステムと、その上のGo言語の関数たち(1)
    massa142
    massa142 2017/07/01
    “ディスクの読み書きはとても遅い処理であり、なるべく最後までやらないようにしたいタスクです。 そこでLinuxでは、VFSの内部に設けられているバッファを利用することで、ディスクに対する操作をなるべく回避”
  • Unixドメインソケット (1/2)

    今回はソケット通信の最終回ということで、Unixドメインソケットについて紹介します。 UnixドメインソケットはPOSIX系OSで提供されている機能です。 コンピュータ内部でしか使えない代わりに、高速に通信が行えます。 TCP型(ストリーム型)と、UDP型(データグラム型)の両方の使い方ができます。 WindowsではこのUnixドメインソケットをそのまま使うことはできません。 似た概念の機能として、「名前付きパイプ」というものが存在します。 以降の説明では、まずUnixドメインソケットについて説明したあとで、 Windowsの名前付きパイプについても説明します。 (Windowsメインの方は、前半のUnixドメインソケット固有の説明については軽く流して読んでください。) Unixドメインソケットの基 TCPとUDPによるソケット通信は、外部のネットワークに繋がるインタフェースに接続しま

    Unixドメインソケット (1/2)
    massa142
    massa142 2017/07/01
    “Unixドメインソケットで作成されるのは、ソケットファイルという特殊なファイルであり、通常のファイルのような実態はありません。 あくまでもプロセス間の高速な通信としてファイルというインタフェースを利用”
  • UDPソケットをGoで叩く

    前回と前々回の記事では、Go言語によるTCPソケットの通信例を紹介してきました。 今回は、ネットワークの解説でTCPと一緒に紹介されることが多いUDPのソケットをGo言語で触ってみます。 今回の記事の概要部分は佐藤貴彦氏、若山史郎氏、小泉守義氏にアドバイスをいろいろもらいました。 ありがとうございます。 UDPが使われる場面は昔と今で変わってきている UDPはTCPと同じトランスポート層プロトコルですが、TCPと違ってコネクションレスであり、誰とつながっているかは管理しません。 プロトコルとしてデータロスの検知をすることも、通信速度の制限をすることもなく、一方的にデータを送りつけるのに使われます。 その際にはパケットの到着順序も管理しません。 TCPとくらべて機能が少なくシンプルですが、そのかわりに複数のコンピュータに同時にメッセージを送ることが可能なマルチキャストとブロードキャストをサポ

    UDPソケットをGoで叩く
    massa142
    massa142 2017/07/01
    “TCPの場合は接続前のハンドシェイク(握手・通信開始の準備)に1.5RTT分の時間がかかりますが、UDPはメッセージを直接送りつけるだけなので0RTTです”
  • GoでたたくTCPソケット(後編)

    ソケットの使い方そのものはシンプルです。 繋いでしまったら、書き出し、読み込み、クローズしかありません。 APIリファレンスを読めれば、とりあえず使うことはできるでしょう。 ですが、ソケットまわりのパフォーマンスはユーザの体感に直結します。通信が切れる、タイムアウトなどのエラーが発生する可能性も多々あります。 最大の効率を得るには、ボトルネックを中心に最適化を行うしかありません(これは『ザ・ゴール』というビジネス書で「制約理論」として示されている問題でもあります)。 今回は、前回に引き続き、HTTPの機能を再現しながらソケットの使い方について学んでいきます。 HTTPの歴史を通して、ソケットの実行効率を向上させる方法を具体的に見ていきましょう。 圧縮 HTTPの速度アップ手法としてよく使われているのが圧縮です。 昔よりもインターネットやWifiの性能は向上しましたが、それでもCPUを使って

    GoでたたくTCPソケット(後編)
    massa142
    massa142 2017/07/01
    HTTP/2では、ここをバイナリ化して、小さい単位(フレーム)に分割します。 また、パイプライニングで必須だったリクエストとレスポンスの順序の保証が不要になりました
  • GoでたたくTCPソケット(前編)

    このうち、アプリケーションを作るために気にする必要があるのはトランスポート層よりも上のレイヤーだけです。 実際のインターネット通信では、ケーブルや無線を通してIPパケットの形でデータがやり取りされますが、 アプリケーションで直接IPパケットを作ったりするわけではありません。 HTTPやTCPのレベルで決められているルールに従って通信をすれば、それより下のレイヤーで必要になる詳細を気にすることなく、 ネットワークの向こう側にあるアプリケーションとやり取りができるわけです。 Go言語では、HTTP、TCP、UDPについて組み込みの機能が提供されています1。 実用的なアプリケーションでは、それらの機能を使って、自分のアプリケーションに必要なプロトコルを実装していくことになります。 HTTPとその上のプロトコルたち 今回の記事の目標は、ネットワークを扱うプログラムにとって低レベルなソケットをGo

    GoでたたくTCPソケット(前編)
    massa142
    massa142 2017/06/25
    “基本的にHTTPの歴史は、「高速化」と「セキュリティ強化」という2つのベクトルに沿って進んできました。 そんなHTTPの機能をプロトコルレベルで見ると、ソケット通信の実践的な手法がいろいろと学べます”
  • Goから見たシステムコール (1/2)

    今回は、システムコールそのものについて深く掘り下げていきます。 システムコールとは何者で、ないとどうなるのか? システムコールを呼び出すコード(Go言語アプリケーション側)を探索しよう システムコールから、実際にOSカーネル内で仕事をする関数が呼び出されるまでのステップは? システムコールの呼び出しをモニターするツールの紹介 とはいえ、Goでアプリケーションプログラムを書くほとんどの人は、直接システムコールを呼び出すコードを書くわけではないでしょう。 また、OSを改造してシステムコールを自分で作成することもまれでしょう。 そのため、今回の記事にはサンプルコードを使ったハンズオンはあまりなく、手を動かしてコード化するネタはありません。 この連載のテーマは「プログラマの視点から、具体的で役に立ちそうな低レイヤーの情報を提供する」ことですが、今回に限っては座学的な内容です。 謝辞 今回の執筆にあ

    Goから見たシステムコール (1/2)
    massa142
    massa142 2017/06/25
    “ asmlinkageフラグを付けることで、引数がすべてCPUのレジスタ経由で渡されるようになるため、スタックを使わずに情報が渡せるようになります”
  • 低レベルアクセスへの入り口(2):io.Reader前編

    前回はGo言語が提供する io.Writer を紹介しました。 今回と次回は、それと対になる io.Reader を中心に、仲間のインタフェースをいくつか紹介していきます。 「Go言語ではスクリプト言語並にかんたんにファイル読み込みやネットワークアクセスができる」、という説明を見かけたことがある方も多いでしょう。 確かにGo言語には、ファイル読み込みやネットワークアクセスの結果が1行で得られる、次のような関数が用意されています。 ioutil.WriteFile() : これだけを使ってファイルに書き込める ioutil.ReadFile() : これだけを使ってファイルから読み込める http.Get() : これだけを使ってHTTPのGETメソッドでデータを受け取れる http.Post() : これだけを使ってHTTPのPOSTメソッドでデータを送れる 実はこれらのAPIは、今回の記

    低レベルアクセスへの入り口(2):io.Reader前編
    massa142
    massa142 2017/06/25
    “io.Reader をそのまま使うのは多少不便なため、入力を扱うときは補助関数を使うことになります。 PythonやRubyであれば、そうした補助的なメソッドもすべてファイルのオブジェクトが持っていたりしますが、Go言語では特別
  • 低レベルアクセスへの入り口(3):io.Reader後編 (1/2)

    第3回の記事ではGo言語の io.Reader インタフェースの基と、よく使う構造体を紹介しました。 Go言語が提供する低レベルの仕組みとの接点である io.Writer と io.Reader 、それに、これらを利用するさまざまな関数や構造体を使って、いろいろな処理ができることが伝わったのではないでしょうか? 第2回から今回までの内容を把握していれば、ソケット通信(第6回あたりから紹介する予定)さえ恐れることはありません。 今回も、前回に引き続き io.Reader の関連機能を紹介していきます。 具体的には次のような内容です。いずれも少し低レベルな通信を直接行いたいときに便利な機能です。 バイナリ解析に便利な機能群 テキスト解析に便利な機能群 ちょっと抽象的な io.Reader の構造体 バイナリ解析用のio.Reader関連機能 io.Reader から出てくるデータは、テキスト

    低レベルアクセスへの入り口(3):io.Reader後編 (1/2)
    massa142
    massa142 2017/06/23
    ストリームを表すモデル図がわかりやすい