サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
都知事選
qiita.com/hnw
どんなプログラミング言語でもメモリリークの追跡は難しいものです。特に、他人の作ったライブラリでメモリリークがある場合、原因を切り分けるのは非常に面倒な仕事になります。 Pythonにはtracemallocという組み込みモジュールがあり、これがメモリリークの調査に便利だったのでまとめてみます。 メモリ消費量トップ10を出す tracemallocのマニュアルにも書いてあるのですが、下記のようにするとメモリ消費量のトップ10が出せます。 import tracemalloc tracemalloc.start() # ... メモリリークしてるっぽい処理 ... snapshot = tracemalloc.take_snapshot() top_stats = snapshot.statistics('lineno') print("[ Top 10 ]") for stat in top
この記事は、KLab Engineer Advent Calendar 2021 の25日目の記事です。大遅刻してしまいました、ごめんなさい。 こんにちは。KLabで今年の2月からCTOをしています@hnwです。 CTOに就いて以降、社内のエンジニアの方とお話をする機会が増えました。1on1だったり少人数の会議だったり形式は色々ですが、興味深い話をたくさん聞けて、自分にとっても会社にとっても必要なことだと感じています。 そうした際にエンジニアとしての将来の理想像やキャリアパスといった悩みを聞くことがあります。私もその場で言えることは言っているつもりですが、うまく伝わったか、もっと言えることがあるんじゃないか、とモヤモヤすることがあります。本稿ではそのモヤモヤを「○○問題」として整理してみました。 最初にお断りしておくと、キャリアの話は基本的には個人の問題ですから、あまり他人の話を真に受けす
apt-keyはapt用のGPG公開鍵を管理するコマンドです。3rd partyのリポジトリを追加するときなどに利用します。 ところで、誤って登録してしまった公開鍵を消すのに意外と苦労したので紹介します(apt-key listの出力が昔と変わっていて、古い情報がヒットしてしまった可能性がありそう) 消し方 登録済みの公開鍵を削除するコマンドは次の形式になります。
はじめに botプログラムによる機械的・連続的な入力を防ぐ目的で開発されたCAPTCHAという技術があります。人間にしか解けないような問題を解かせて、botの入力を排除するような仕組みの総称です。 CAPTCHAは誕生当初こそ有用な技術でしたが、いまや並のCAPTCHAではbotを防げない時代になりつつあります1。プログラム技術、特に機械学習の技術が発達した結果、テキスト認識については人間よりも機械の方が賢くなってしまったためです。 一方で、機械学習の知識がない普通のエンジニアからすると、CAPTCHAを破るプログラムを一から書けといわれても途方に暮れてしまいます。筆者もそんな一人ですが、機械学習APIを使えば機械学習の知識が無くてもCAPTCHAが破れるのではないか?と考えて試してみました。本稿ではその成果を紹介します。 CAPTCHAとは すでに紹介したとおり、CAPTCHAは人間と機
mackerel-agent v0.64.1より、Raspberry Piで使える32bit ARM用Debianパッケージが自動ビルドされるようになりました。 これまでも32bit ARM用のバイナリファイルを含むtar.gzは自動ビルドされていたのですが、バイナリファイル以外の部分は自分で頑張る必要がありました。 一方、今回から作られるようになったDebianパッケージにはsystemdによる自動起動の設定も含まれるので、手持ちのRaspberry PiをシュッとMackerel管理下に置けるようになります。 Raspberry Piは画面無しで運用することが多いと思います。そんなときでも、Mackerel管理しておくとトラブルシューティングが楽になるのでオススメです。 動作例 筆者のRaspberry Pi Zeroでの動作例です。 メモリ512MB1のマシンでもちゃんと動いているの
表題の通り、GCPのCloud Functionsの実体はGAEなんじゃないか、という話をします。 元々そういう公式発表があるんだとしたらこの文章は寝言です。 Cloud FunctionsのURLがGAEと一緒だ! Cloud Functionsで「トリガー」「Pub/Sub」の関数を作ると、対応するPub/Subトピックのサブスクライバが自動的に追加されます。このサブスクライバはpushタイプになっており、そのURLは https://*.appspot.com/ 以下になっています。 これはCloud Functionsの実体がGAEである証拠では…という気がしたので記録として残しておきます。 一方で、仮にこの予想が真実だったとしても全く意外性がない印象です。GAEもCloud Functionsも言語とバージョン丸被りですし、両方gVisor使ってるって話でしたしね…。 補足 ちな
SSHでは初回接続時に接続先ホストの公開鍵を保存しておき、次回接続時にホスト鍵を比較して前回と同じホストに接続したかを確認するような仕組みになっています。そのため、IPアドレスの振り直しやOS再インストールなどでホスト鍵が変わってしまった場合、次のようなエラーメッセージが出てSSH接続が失敗してしまいます。 $ ssh example.com @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
筆者はHaskell入門者で、趣味として競技プログラミングサイトのAtCoderやProject Eulerの問題を解いています。 これら2サイトのうち、Project Eulerは数学っぽい問題が多く、他言語と比べてHaskellは有利なくらいの印象ですが、AtCoderでは入出力がハマりどころになります。 特に入力が大量の場合1、コンパイル言語のはずのHaskellがスクリプト言語より遅くなることがあります。実際、私はそのような問題でTLE (Time Limit Exceeded、実行時間制限オーバー) してしまい悲しい思いをしました。 本稿ではこの原因と対策を紹介します。 HaskellのString型は遅い 私がTLEしてしまったのは、標準入力の処理にgetLineやgetContentsを使っていたのが理由です。これらの関数は入力をIO String型として処理しますが、このS
複数のGCPプロジェクトで並行作業していると、うっかり別のプロジェクトに gcloud app deploy などしてしまうことがありませんか?私はあります。 事故そのものも悲しいんですが、事故のたびにアカウントとプロジェクトを切り替える方法を毎回ググっていて悲しいので自分用にまとめてみます。 状態確認 gcloudコマンドにはデフォルトのアカウントやプロジェクトが設定できます。何か作業する前に現在のデフォルト値を確認しましょう。 $ gcloud config list (略) [core] account = ***@***.jp disable_usage_reporting = True project = **** accountとprojectが期待通りの値か確認して、期待と違ったら設定し直す必要があります。 ちなみにデフォルト設定の実体は$HOME/.config/gclou
Puppeteerで次ページへの遷移を待つ場合の書き方について。 通常の遷移の場合 新規ウインドウが開かないような通常の遷移を待つ場合、以下の書き方が決まり文句だという認識です。 await Promise.all([ page.waitForNavigation(), page.click('a') ]); ページ遷移を待ち受けてからページ遷移を実行して両方の完了を待つ、という処理です。 Promise.all()を使わない変形として次のような書き方も可能です(私は最初の例の方が見やすいと思いますが)。
この記事は KLab Engineer Advent Calendar 2018 の6日目のエントリです。 最近のmacOSでは新しいファイルシステムが採用されていて、ファイルコピーが一瞬でできますよ、性能改善やストレージの空き容量を増やすのに役立つかもしれませんよ、という話を紹介します。 最近のmacOSのファイルシステム:APFS まず最近のMacのファイルシステムについて紹介します。2017年9月リリースのmacOS 10.13 (High Sierra) 以降、macOSでは標準のファイルシステムとしてAPFS (Apple File System) が採用されています。これはコピーオンライトファイルシステムというジャンルに属するもので、同じファイルを作成する際に実体を共有して、どちらか一方が更新された時に初めてファイルコピーを行うような仕組みを持つ、モダンなファイルシステムです。
GAE/SE PHP 7.2環境では5.5環境とapp.yamlの書き方が変わっており、フロントコントローラ構成が前提になっています(参照:「GAE/SE PHP 5.5環境と7.2環境のapp.yamlの違い - Qiita」)。 しかし、置いたPHPファイルをそのまま実行したいんだ!ということもあるのではないでしょうか。そうした状況のための設定例を紹介します。 . ├── app.yaml ├── index.php ├── php │ └── *.php └── static ├── css │ └── *.css └── js └── *.js runtime: php72 entrypoint: serve index.php handlers: - url: /js static_dir: static/js - url: /css static_dir: static
私の買ったRaspberry Pi 3 Model B+は紙の箱に剥き出しで基板が入っていました。私はRSコンポーネンツ版を購入したのですが、Element14版も同様の状況のようです。 (写真は上記フォーラムより引用) Raspberry Pi 3まではパッケージを開けると基板が黒っぽい静電気防止袋に入っていたように思いますが、それが無くなったのはどういうことなんだ!と盛り上がっているのが上記のフォーラムというわけです。 同梱の白い紙が静電気防止袋の役割を果たしている 実はRSコンポーネンツ版RPi3B+の箱を開けると、基板の他に謎の白い紙が入っています。 バーコードが印刷されているだけで他に何の説明もない紙ですが、なんとこれが静電気防止袋の役割を果たしているんだそうです。 よく見ると確かに何か塗料のようなものが塗られているような気もしますが、言われなかったら普通の紙にしか見えません。本
Firebase Hostingで動的コンテンツのホスティングができないか調べていたら、「それCloud Functions for Firebaseでできるよ」というドキュメントが英語版だけ存在した(2017年8月時点)ので実際に試してみました。 Cloud FunctionsとFirebase Hostingを組み合わせるメリットは次の3点かと思います。 静的コンテンツと動的コンテンツを組み合わせやすくなる 動的コンテンツのURLを自由に設定できる カスタムドメインの指定ができる 以下、手順を紹介します。 セットアップ まずFirebaseのコンソールにログインし、適当なプロジェクトを1個作成します。 次にNode.jsを最新版にアップデートします。私はmacOSを使っていますが、他のOSを利用している場合は適宜読み替えてください。
Unixコマンドラインで動くテンプレートエンジンが欲しい、変数置換さえできれば良い、ということがたまにあります。たとえば、CI中にCIサーバ上にJSONファイルを作りたいが、一部の値は環境変数経由で動的に与えたい、なんてことがあるわけです。 m4を使うこともできなくはないですが、牛刀をもって何とかって奴ですよね(そもそもm4よく知らないし)。そこでenvsubstですよ。 envsubstはgettext付属のツールで、簡単な環境変数展開を行います。展開対象は$FOOと${FOO}の2パターンのみです。デフォルト値の指定(${FOO-BAR})すら対応していません。 利用例 たとえばこんなファイルがあったときに
2017年3月にGoogle Cloud Platform (GCP) の価格改定があり、無料枠も広がりましたね。試しに使ってみている、という方も多いのではないでしょうか。 そんな方向けに、GCP課金データのエクスポート設定をしておくと良いですよ、という話を紹介します。しかも、今回の価格改定からはこの課金データの保存・取得が無料でできるようになっています1。 ここで紹介するGCPの課金データというのは、自分が管理している全プロジェクトの日ごと・サービスごとの使用量と費用がわかるようなCSVファイルのことです。 具体的には、次のような情報が格納されています。 3/21の xxxプロジェクトの Datastore小規模オペレーションは 63924リクエストで 0円でした このように課金額だけでなくサービスの利用量も記録されているので、無料ユーザーにとっても有用です。こうした情報の多くは管理画面
2017年3月からGCEのf1-microインスタンスが一人1台無料になりました。私自身3月からずっと起動したままで運用してきて10月まで無料で使わせてもらっていたのですが、下記の通り11月は1円を請求されていました。 GCEのf1-microインスタンスは1ヶ月分(月の日数に応じて720時間もしくは744時間)のCPU利用が無料になるのですが、11月は721時間使っていたというのです。 課金された理由はサマータイムの終了 いい大人であれば1円くらい仕方ないなと思うところでしょうが、私は理由が気になって課金ログを確認してみました。すると、11/5だけ25時間分のCPUを使っていることがわかりました。アメリカの11月第1日曜日はサマータイム終了の日なので、実際に1日が25時間あるのです。 これがGoogleさんの意図通りかは不明ですが、おそらく考え漏れなんじゃないでしょうか。サマータイムって
みなさん、Gooble Cloud Platform (GCP)使ってますか?私は今年3月の無料枠(Always Free Products)強化のタイミングから便利に使わせて頂いております。といっても、これまでGoogleさんに支払った額は1円です。ろくでもないユーザーでごめんなさい。 有用かどうか若干あやしい1記事「GCEのf1-microインスタンスを真にタダで使う方法」についても多くの方に読んで頂いているようです。やはり皆さん無料という言葉には弱いようですね。 そんなGCPを使ってみての感想ですが、「今のペースで使うと課金発生しそうか?」がわかりにくいように感じています2。企業ユーザーであれば事前に「Google Cloud Platform 料金計算ツール」で見積もっておくこともできるでしょうが、我々ド素人が試しに使うのに事前見積りが必須となると面倒すぎます。「このペースだと課金
表題の通り、Gitでブランチ名に使えない文字が何なのかを調べてみました。正確なところはman git-check-ref-formatすると書いてあるんですが、自分用にざっくりまとめます。 ブランチ名として常に使えない文字 コントロールコード(0x00から0x1fと0x7fの33文字) 空白文字(0x20) チルダ ~ キャレット ^ コロン : クエスチョンマーク ? アスタリスク * 開きブラケット [ バックスラッシュ \ ブランチ名として常に使えない文字列 .. @{ // もうちょっとだけ使えないパターンがあるんじゃ… 先頭の.または/ 末尾の.または/ 末尾の.lock @1文字だけのブランチ名 グルーピングの先頭最後の話とかをすると面倒なので、詳細はman pageを見てください、ということで。 使っても良い文字 上記からわかる通り、8bit文字については特に制約がありません
jobs: include: - if: branch = master stage: Push release tag script: ./git-tag.sh deploy: [] このようにすると、matrix:で定義してある既存のテストは全て「test」ステージのジョブになり、その後続タスクとして「push release tag」ステージが実行されることになります。このステージではgit-tag.shが実行されます。 リリースタグを打つスクリプト このgit-tag.shの中身は次のようなものです。 #! /usr/bin/env bash # この時点で打つべきタグを決定して$TAGに代入しておく # タグの情報源はgitのコミットログやプロジェクト内の設定ファイルなどが考えられる TAG=${PKG_VERSION}-${PKG_RELEASE} if [[ -n "$(gi
PHP5までは暗号論的に安全な疑似乱数生成器(CSPRNG)を提供する標準関数がなかったため、CSPRNGが必要な場合に自分で明示的に/dev/urandomにアクセスしたりしていました。opensslエクステンションおよびmcryptエクステンションもCSPRNG関数を提供していますが1、どちらも必須のエクステンションでは無いため、ライブラリなどでは採用しにくい状況があったはずです。 PHP7から、どの環境でも動くCSPRNG関数としてrandom_bytes()とrandom_int()の2つが新規実装されます。 <?php // ランダムな2バイトの文字列を返す。各バイトは0x00から0xffのどれか。 var_dump(bin2hex(random_bytes(2))); // 5以上9以下の整数をランダムに返す var_dump(random_int(5,9)); 実装 Wind
家庭用の有線LANルータのファームウェアを入れ替えてLinuxディストリビューションをインストールしたときのメモです。 LEDEとは LEDE - Linux Embedded Development Environment LEDEは組み込み用途のLinuxディストリビューションで、家庭用の有線LANルータ・Wi-Fiルータのファームウェアを置き換えることで機能追加をしたりカスタマイズ性を高めたりしようというプロジェクトです。具体的には、DDNS・VPN・VLAN・QoSなどの設定ができるようになったりします。また、古いルータがDS-Lite(RFC6333)対応になるので、一部の人は嬉しいかもしれません。ルータにsshでログインできるようになるので、トラブルの切り分けが若干やりやすくなるメリットもあります。 LEDEは2016年5月に母体であるOpenWrtからforkしたプロジェクト
「GoのMIPS32 soft-float対応が来たぞー(1.9に入るとは言っていない) - Qiita」で紹介した通り、Goで書かれたコードがFPUなしのMIPS32環境で動くようになりました。 そこで、ブロードバンドルータ上でmackerel-agentを動かしてみます。ブロードバンドルータのCPU(SoC)は32bit ARMか32bit MIPSのどちらかが使われていることが多いのですが、今回のターゲットマシンではMIPSが採用されています。また、この環境ではブロードバンドルータ向けのLinuxディストリビューションであるLEDE(OpenWrtのfork)が動いています。 以下、参考画像 ビルド 単にmake buildとしてもうまくいかなかったので、Makefileを眺めつつ下記の手順でビルドしました。ここで使うgoバイナリはMIPS32向けsoftfloatパッチが当たったも
MacOSX El Capitan(10.11)で起きたトラブルです(2020-06-06追記: Mojave(10.14)でも状況は同じです)。 某OSSのtar ballを$TMPDIR以下に展開してビルドしていたのですが、なぜか展開後のファイルのうち一部のファイルだけ1日後に消える事件が発生しました。 消されるファイルのうちinstall-shはconfigureで必要なファイルなので、昨日作業したディレクトリで今日も./configureしようと思ったら次のようにエラーで怒られてしまいます。 $ ./configure checking for grep that handles long lines and -e... /usr/bin/grep checking for egrep... /usr/bin/grep -E checking for a sed that does
組み込み向けLinuxディストリビューションであるOpenWrtを触っていると、普段のLinuxではあまり見慣れない技術が使われていることに気づきます。本稿ではOpenWrtのファイルシステムで利用されているOverlayFS、SquashFS、JFFS2とその背景知識についてまとめます。 「OpenWrt Project: Filesystems」も合わせて参照してください。 OverlayFS OverlayFSは2層のファイルシステムの内容を重ね合わせるようなファイルシステムで、下層は読み込み専用、上層は読み書き可能なファイルシステムを使うのが一般的です。OverlayFS全体としては上層と下層を合成したようなファイルシステムとして振る舞います。 OpenWrtの場合、/以下がOverlayFSにより2つのファイルシステムの重ね合わせで実現されています。 SquashFS OpenW
Amazon Dash Buttonはボタンを押すだけで商品が届くというコンセプトのデバイスです。小さいボディですが、これ単体で無線LANネットワークに接続してAmazonにHTTPSリクエストを投げてくれます。 これを自作IoTボタンにする試みが半年くらい前に流行りました。ネットで検索してみると、ボタンを押すとSlack上で発言する、みたいな使い方が多いですね。 ところで、このボタンが押されたことを検出する仕組みは下記の2種類のどちらかを使っている人が大半のようです。 ARPやDHCPなどのブロードキャストパケットを別マシンで捕まえる方針 hortinstein/node-dash-button など出来合いのものは大抵この方針 プロミスキャスモードで全パケットを捕まえるパターンもこの仲間と言って良いでしょう DNSサーバに偽のレコードを登録して、amazon宛のHTTPSリクエストを別
WebAssembly上でのシステムコールの扱い、および現時点でのEmscriptenで既存Cライブラリの移植性がどこまで担保されているのか、調べた内容をまとめます。 WebAssemblyとEmscriptenの守備範囲 WebAssemblyでは実行バイナリのフォーマットや利用可能オペコードなどは定義されていますが、守備範囲は仮想CPUの周辺領域までだというのが筆者の理解です。つまり、WebAssemblyのレイヤでシステムコールや標準Cライブラリが提供されるようなことはないはずです。 しかし、システムコールやlibcが無ければ既存のC資産は全く使い物になりません。なければ作るしかないということで、Emscriptenでは軽量libc実装のmuslを採用しており、これを静的リンクしてwasmファイルを生成しています。また、システムコールについてはJavaScriptで実装して提供してい
$ php -dopcache.enable_cli=1 -dopcache.opt_debug_level=0x10000 /tmp/test.php $_main: ; (lines=8, args=0, vars=2, tmps=5) ; (before optimizer) ; /private/tmp/test.php:1-6 L0: ASSIGN CV0($a) int(1) L1: T3 = MUL CV0($a) int(2) L2: ASSIGN CV1($b) T3 L3: INIT_FCALL 1 96 string("var_dump") L4: T5 = MUL CV1($b) CV1($b) L5: SEND_VAL T5 1 L6: DO_ICALL L7: RETURN int(1) int(4) コマンドラインオプションの0x10000は最適化前を表すフラ
USから中国・オーストラリア以外への外向き通信には1GBの無料枠があるのですが、中国・オーストラリア宛の外向き通信は1バイト目から料金が発生することになります。上の画像は中国への外向き通信が0.02円(約1MB)発生したことを示しています。 課金の原因はなんとSSH総当たり攻撃 しかし、今回のインスタンスはWebサーバやその他のサービスを動かしているわけではありません。このマシンで唯一listenしているポートはSSHの22番ポートで、それ以外のポートはGCEのファイアウォール機能でパケットフィルタリングされています。 つまり、課金の原因となった通信は攻撃者によるSSHログイン試行以外に考えられません。実際、ログを確認してみると世界中からのSSHログイン失敗のログが残されていました。 課金を防ぐには 自分のせいじゃないのに課金されるなんてひどい!とも思いましたが、GCP全体としても攻撃者に
次のページ
このページを最初にブックマークしてみませんか?
『@hnwのマイページ - Qiita』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く