サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
GPT-4o
gfx.hatenablog.com
便利なソフトウェアを定期的に掘り起こすぞ活動です。 ghq は「GitHub repoのclone先を統一することでいろいろ便利にできるコマンド」で、github repoのclone先を、カレントディレクトリに依存せず ~/.ghq/github.com/$owner/$repo/ にします。 使い方: ghq get -p --shallow $URL peco は、テキストのリストをgrepしてそれに対してなにかコマンドを起動するみたいなやつで、ほかのツールと組み合わせて使います。 ghq + peco .zshrc などにエイリアスを作っておきます。 alias g='cd $(ghq list --full-path | peco)' alias b='hub browse $(ghq list | peco | cut -d "/" -f 2,3)' alias v='code
CommonMarkというのはMarkdownの標準化を目指して2014年に立ち上がったプロジェクトです。 当時のニュース: Standard Markdown Becomes Common Markdown then CommonMark (日本語版) 公式サイト: http://commonmark.org/ あれから3年、とうとうGitHubがCommonMarkを採用したというアナウンスがありました。つまり、長らくMarkdownデファクトと考えられてきたGFM: GitHub Flavored Markdownは、いまやCommonMarkのスーパーセットなのです。 A formal spec for GitHub Flavored Markdown | GitHub Engineering (2017/03/14) To ensure that the rendered Mar
追記: Terser v3.10.11 でこの問題が修正されていることを確認しました。現在は collapse_vars: false というワークアラウンドは不要になりました。 webpackのproduction buildの話です。 Reactが悪いわけではないんですが、たまたま秘孔をつくコードがReactないし関連するReact v16に依存するライブラリにあったんでしょうね。 Reactをv16にアップグレードしたら webpack で production build ができなくなった pluginを着脱しながら調べた結果、 uglifyjs がクラッシュしていることがわかった uglifyjs は現在 オリジナル + 2つのforkがあり、すべてで再現する original: https://github.com/mishoo/UglifyJS fork 1: https:/
RxJava Advent Calendar 2015 の 12月12日分です。 RxJavaのSchedulersは、RxJavaのコールバックの実行スレッドを制御するためのコンポーネントです。 恥ずかしながら、最近まで subscribeOn() と observeOn() の使い方を理解していませんでした。よって本稿では、 subscribeOn() と observeOn() の現状の私の理解したところを書きます。 SchedulersとsubscribeOn() / observeOn() RxJavaのSchedulersまわり一番難しいのは subscribeOn() と observeOn() がどう違うのか、という点だと思います。 これは実用的には以下のように考えるとよいかと思います。 subscribeOn() は Observable.OnSubscribe#call
Ormaの開発の際に他のORMはどういう設計思想なのかを調べたときの知見をもとに、DroidKaigi 2017用に仕上げた発表です。 これ契機にORMについて一家言ある人が増えるといいなと思いながら発表しました。 SQLiteDatabase (SQLiteOpenHelper) を直接つかうかどうかでいうと圧倒的にORMをつかったほうが早く品質のよいアプリを開発できると思っていて、それはやはりORMのマッピング、クエリビルダ、アソシエーション、pub-sub、マイグレーションといった機能が便利だからなんですよね。ただ便利といういだけのみならず、型安全だったり自動化してくれたりと信頼性を高める工夫を書くORMがしているわけで、それを使わないのはもったいないです。 その上で、まあ私としてはOrmaが私の感じる問題を解決してくれる唯一のORMなのでOrmaを使いますが、機能や将来性などを考え
Android N preview-2 がきましたね。 Android N Developer Preview 2, out today! | Android Developers Blog AOSPにはまだtagがきていませんが、masterブランチをみるとStream APIが実装されています。 追記: android-n-preview-2 tagがきてました android-n-preview-2 - platform/libcore - Git at Google ojluni/src/main/java/java/util/stream - platform/libcore - Git at Google もちろんOptionalもきてます。preview-1のときになかったのは、単に移植が間に合わなかったというだけみたいですね。 ojluni/src/main/java/ja
1行で 「特定の場合でバージョニングしなくても対応できることはある」程度なので、「バージョニング不要」とは言わないほうがよい どういうことか RESTful API から GraphQL へ、GraphQL から別の Web API systemへ、ということを考えると大きな意味でのバージョニングは必要 e.g. 実際にGitHub は GraphQL API を "API v4" と呼んでいる 細かなレベルのバージョニング、たとえば1画面の仕様が微妙に変わるたびに /foo, /foo_201807_1, foo_201807_2 みたいにどんどん特定画面専用APIを定義していく、みたいな意味でのバージョニングは不要 fieldの追加は無造作に行ってよい RESTful APIでもfieldの追加は普通はできる、ただし負荷に注意 重いcomputed fieldの場合でも、GraphQL
The Maskarade project · GitHub 最近イマイチAndroidの活動ができてないんですが、Androidライブラリのメンテを諦めたわけではなくて、たとえばOrmaとかはまだやりたいことがいくつかあるのでやるつもりはあります。一方で、ちゃんと新しいメンテナがいたほうがいいなーというプロジェクトもあって、とりあえず私のメンテする気のあるなしに関わらずユーザーがいそうなAndroidライブラリを全部まとめて maskarade(マスカレード)というorganizationに移すことにしました。 何故これが必要なのかというと、新しくオーナーシップをもったメンテナを受け入れられる体制にするためにorgが必要だからです。GitHubは個人アカウントにあるリポジトリのオーナーシップをコラボレータに渡すことはできないんですよね。なので、オーナーシップを誰かに渡したいときは (1)
仕事で関わっているアプリのmasterブランチに Android Data Binding が導入されたのを見届けたので、自分でもちょっと使ってみました*1。 DataBidingのメリットや導入にあたってのハマりどころは以下のsys1yagiさんのエントリから: Android Data Binding Library 雑感 - visible true Data BindingとMultidexの兼ね合いの問題を大体倒したので実用段階待ったなし - visible true さっそく個人アプリでも導入してみたところ、ドキュメントそのままだとGoogle Daggerとの相性が悪くてコンパイルが通りませんでした。これはstackoverflowで同じ問題が報告されていました。それによればDataBinding compilerを自分でdependenciesに書かなければならないとのこと
あるいは私がDefinitelyTyped (DT) が失敗だと思っている理由、です。 DefinitelyTypedは明確に失敗だと思っているので、あれを避けるのはそんなに難しくないかなと。まず (1) anyを認めて「型がなくてもいいや」という気持ちでいく (2) 中央repoは作らずそれぞれのgemに対して型定義パッチをおくりつける でなんとかなるっしょ。— FUJI Goro (@__gfx__) September 19, 2017 あたりが話の発端です。 DTについては以前いまいちイケてない理由を書いたことがあります。 TypeScriptのDefinitelyTypedは「ダメでもともと、うまく使えればラッキー」くらいの距離感がよい - Islands in the byte stream この時の話を一言でまとめると「ライブラリの作者ではない第三者がメンテしていることが多く
2015年の11月から開発を続けているAndroid用O/R Mapper Ormaですが、このほどv1.0.0をリリースしたので入門記事を書きました*1。 UPDATE: この記事の対象はv4.1.0です。最新版はリポジトリでご確認ください。 関連エントリ: ActiveAndroidからOrmaに移行するための4つのステップ - Islands in the byte stream Table of Contents Table of Contents Ormaとは何か 1. SchemaDiffMigrationによる自動マイグレーション 2. 補完に優しく型安全なインターフェイス 導入 モデルクラスの定義 @PrimaryKey のオプション @Column のオプション データベースハンドル OrmaDatabase CRUD操作 1. Inserter, Selector, U
スギャブロエックス(id:sugyan, id:kazeburo, id:gfx) で予選に出場して2日目2位でした。去年は予選敗退だったので2年ぶりの本戦出場です。 バランスの良い良問で大変楽しかったです。ISUCON運営チームに於かれましては大変おつかれさまでした&ありがとうございました。 isucon.net スギャブロエックスのスコア推移: repo: https://github.com/gfx/isucon7-qualify 言語 採用言語はnodejsでした。もともとはPerl界隈で知り合った3人ですが、最近だれも現役でPerlを書いておらず、go, ruby あたりでやるか〜みたいな話を最初していました。途中でnodejs実装が追加されることになったので、nodejsにしたい!と希望してこうなりました。 スギャブロエックスがnodejsだと…— Ryuta Kamizono
今更感ありますがReact Reduxを導入したの所感をメモしておきます。 github.com ざっとみてこれなら自分でも再実装できそうだなという印象 いままではreact-micro-container でfluxしてた cf. 小さいReactアプリケーションのためのライブラリ書いた - Qiita 新規Railsアプリに小さく導入するReact // Speaker Deck React Reduxにすると、個々のreact componentをfluxフレームワークに依存しない形で設計できる これに対して react-micro-container はcontainerに制御されることを意識した設計になる(=containerとcomponentで設計が異なる) React ReduxなしでReactを初めてRect Reduxを導入するのは簡単だし、あとから別のflux実装にす
2022年の6月に第二子であるrfxを受け入れました。それに伴い、11月最終週から4月第1週いっぱいまで、約4ヶ月の育休をとることにしました。 第一子であるmfxのときは育休はとらなかったので、はじめての育休です。なんならプログラマーとして働き始めてから十余年、1ヶ月以上休みをとるのは初めてです。 rfxが産まれてからこのかた、認知的に高負荷な状態が続いていて、そのわりには仕事にも全然集中できなくてけっこうしんどい思いをしていたので、ここで育休をとって育児に専念できるようになるのは正直ほっとします。一方で、育休給付金を踏まえても収入が激減すること、4ヶ月の間キャリアを休止することについては不安もあります*1。 とくに収入については結構苦しいところです。育休給付金は雇用保険でまかなっていて、年々改善はしてきていますが、支払い上限が1ヶ月約30万円までとなってるからです。一方で、夫婦どちらも育
電子書籍関係者で勉強会をやったので資料を公開します*1。 speakerdeck.com 追記: Fragmentの状態の復帰はFragment#onViewStateRestred(Bundle)) でできるのではという指摘をいただきました。試したところ想定通り動いたのでコードの方は修正済みです。 デモ実装は https://github.com/gfx/TinyPdfReader で、以下のようなことが実装されています。詳細は資料をご覧ください。 ピンチイン・ピンチアウトでのズーム(PhotoViewを使用) 画面の左右タップでの移動 Landscape時の見開き(1画面2ページ) 見開きでも表紙は1ページだけでセンタリングする 画面回転時の読書位置の保存 ページロード時の非同期画像読み込み +ふわっと表示 全画面表示(immersive mode) & 画面中央タップでトグル その他
GitHub - gfx/ruby-regexp_trie: Optimized Regexp builder with Trie (a Ruby port of Perl's Regexp::Trie) # Gemfile gem 'regexp_trie' これははてなキーワードやWikipediaのリンクのように、ある程度の量のテキストに対して大量のキーワードをマッチさせるときに、最適化した正規表現を生成するライブラリです。 はてなキーワード*1をとあるブログエントリ*2にマッチさせるための簡単なベンチマークもあります。 example/benchmark.rb 結果: $ bundle exec example/benchmark.rb (snip) user system total real Regexp raw 4.270000 0.030000 4.300000 ( 4.3
https://github.com/soutaro/querly Rubyを構文解析したASTに対して独自DSLでパターンマッチ&メッセージを出すツール プロジェクト固有の事情に配慮したLinterとして使える false positive 上等で注意喚起として使う たとえばKibelaの querly.yaml から一部抜粋するとこんな感じです。 rules: # ... - id: kibela.order_by_string pattern: - "order(:dstr:)" - "where(:dstr:)" - "find(:dstr:)" - "exists?(:dstr:)" message: "文字列によるSQL構築は本当に必要ですか? SQL Injection を引き起こさないように気をつけてください。" - id: kibela.block_call patter
追記 (2021年12月): このエントリを書いた当初、1年経過時点では完全に回復しきったとは言い難くて、エディタのフォントサイズを16ptくらいにしていたのですが、3年たってようやく完全回復してフォントサイズを14にしました。長かった…。 アデノウィルスによる流行性角結膜炎という病気がありまして、これに保育園〜子供経由で感染した*1結果、しばらく視力障害になりました。 一年半経過した今はほとんど回復していますが、一番悪いときでメガネをしていても両目ともに視力0.1程度といった様相でした。これは角膜が濁っているので、目を凝らしたり近づけたりしてもはっきり見えたりはしません。この視力だと、ディスプレイを使った仕事はまともにできないし、スマホの文字を読むことすら困難で、日常生活にも支障がありました。この視力障害が重い状態が半年は続いて、そのあと1年くらいかけて徐々に回復したわけですが、けっこう
一時的な回避策ですが、このバグが発現する状態になったら「Chromeを再起動する」で回復するようです。このエントリを書いている時点でのmacOSの最新版は 10.13.2 (High Sierra) なので、以降のバージョンでは直ってるかもしれません。 ぼく自身はまだSierraのままなので伝聞です*1。ただTwitterのタイムラインで頻繁にこれ系の悩みを見かけて、そのたびに返信しているのでもっと知られるべきだなと思い、キーボードを叩くことにしました。 追記: Chromeのアップデートがきているときに起きやすいようですが、アップデートが来ていなくても起きるようです。 なんか、アップデートが降って来てる状態だと発生するぽいです— SHIBATA Hiroshi (@hsbt) December 19, 2017 これみんななってたのか。アップデートなくても起きるなあ。 / “High S
Kazuho's Weblog: git blameでプルリクエストの番号を表示する をみて、vscodeとかIntelliJ IDEAのpluginないかな〜と思っていたら、IntelliJ IDEA用にはすでにありました。インストールして数週間使っていますが、git blame を眺める機会が激減していい感じです。ぼくはIDEやeditorにはプラグインを最低限しかいれない派なんですが、これは便利なので "最低限のプラグイン" に入りそうです。 plugins.jetbrains.com 作者は @shiraj_i さんで、ソースコードも公開されてます。 github.com
2016/7/27 にこんなアップデートがあったようです。 Changelog - We've added the option to auto-cancel redundant builds. Read more, and how to enable it, here: https://t.co/MTjOV7ttkF— CircleCI (@circleci) July 26, 2016 Project Settings → Advanced Settings に設定項目があります。 With the exception of your default branch, we will automatically cancel any queued or running builds on a branch when a newer build is triggered on that s
ThreadPoolExecutor を調べていて、 Thread インスタンスの最大数はどんなものだろうと思ったので確認したところ、端末によって異なりますが1000個〜10000個程度でした。これを超えるとOutOfMemoryErrorが発生したり、最悪の場合いきなりクラッシュしたりします。 Executors.newCachedThreadPool() は ThreadPoolExecutor を生成するファクトリメソッドですが、スレッド生成の最大数が Integer.MAX_VALUE (つまり無制限)となっています。このexecutorによってスレッドを数百以上生成することはまずないとは思いますが、上限が定められていない以上うっかり端末の限界値を超えないとも限りません。Androidで Executors.newCachedThreadPool() を使うのはやめたほうがよさそう
suffix arrayを一番簡単なアルゴリズムで実装する - アルゴリズム学習(その6) - $shibayu36->blog; を読んで、ちょうど自分も何らかの形で全文検索を一部実装してみようと思っていたのでRustで真似してみました。 Rustを選んだ理由は、以下の理由からです。 実際に全文検索を実装するのに耐えうるパフォーマンスであること パッケージマネージャなどのエコシステムが完備されていること Rustについてはそれほど詳しくはないのですが、GCや例外がないとのこと。であればパフォーマンスチューニングがC言語並にやりやすい可能性がありますし、一度真面目に勉強してみたいと思っていました。Goと異なり、ジェネリクスがあるのも魅力的です。 というわけでコードこんな感じになりました: pub fn make_suffix_array(s: &str) -> Vec<i64> { use
最近、Kibelaのtslint configの Rule: array-type を "generics" にしました: + "array-type": [ + true, + "generic" + ], 以前は特に指定しておらず、 T[] と Array<T> が混在してていて、それでよしとしていました。今でも、混在することによるデメリットは特にないと思っていいます。ただ、 Array<T> には一つだけメリットがあったのでこちらに統一することにしました。 autofixできるので、エディタ上では T[] と書いて保存時にtslintに Array<T> に直させるということができるため、導入のデメリットがないというのも大きいです。 さて Array<T> のメリットは、 ReadonlyArray<T> に直しやすいということです。 ReadonlyArray<T> は Array
github.com AssemblyScriptという、TypeScriptのサブセットでありWebAssemblyにコンパイルできる言語があります。 ※ WebAssemblyについては WebAssembly の基礎 - nmi.jp などをどうぞ TSのサブセットとはいえ、WebAssemblyにコンパイルしやすくするために若干互換性がない部分もあります。たとえば、 || や && といった演算子の結果はJSだと左辺ないし右辺の値ですが、ASの場合はboolになります。 とはいえ assembly.d.ts のおかげで普通にvscodeで開発できるので、生のWebAssemblyを書くよりはだいぶマシでしょう。 標準ライブラリは std/ 以下をみるといくらか定義されていて、たとえばstring.tsをみると文字列操作の様子がわかります。 https://github.com/As
PlantUML、便利ですよね。はてなブログでも使いたいですよね。ということでやってみました。 まずエントリの最後にこのスニペットを置きます: <script> var a = Array.from(document.querySelectorAll("pre.code")); a.forEach(function (pre) { if (pre.attributes['data-lang'].value) return; var xhr = new XMLHttpRequest(); xhr.open("POST", "https://plantuml-service.herokuapp.com/svg"); xhr.onload = function () { if (xhr.status === 200 && pre instanceof HTMLPreElement) { pre.
ThreeTenABPの差分(v1.0.3...v1.0.4)を見ていて気づいたんですが、Android Lintの結果をテキスト形式で標準出力に出すことができるんですね。マニュアル にも書いてありますが、今日初めて知りました。 lintOptions { textReport true textOutput 'stdout' } これをするとコマンドラインのビルドでlintのwarningやerrorが表示されるので、たとえばCIがlint errorで落ちたときに手元でlintを走らせることなく原因がわかります。 日頃有効にしておくとwarningでも対処しようというプレッシャーになるので、やって損はなさそうです。
railsdm.github.io 発表:「マルチテナント・ウェブアプリケーションの実践」 一文でまとめると「HTTPのリクエストごと、あるいはjobの実行ごとにストレージの名前空間違うから気をつけような!!」ってのを常に意識する必要がありますって話でした。 なおElasticsearchのnamespacing v2はまさに先週の話なのですが、遅くなったというのは勘違いでした。 というのも少しだけ日付けをずらしてfuzzy searchの実験もしており、それがパフォーマンスに悪影響を与えていたようです。fuzzy searchはノイズが増えるので結局無効にすることにしたため、トータルではnamepsacing v2はnamespacing v1よりパフォーマンスがよくなっています。 またブコメでも指摘されているように、テナント横断のことをやり始めるとまたいろいろと新しい課題がでてくると思
google/gson GsonでList<T>をデシリアライズするのがけっこう面倒くさくて、以下のようにしなければいけません*1。 Type collectionType = new TypeToken<Collection<Integer>>(){}.getType(); List<Integer> ints2 = gson.fromJson(json, collectionType); ところが、 List<T> を意味する Type 型を Class<List<T>> と Class<T> から作ることができればハックが不要になるはず!とおもって探したところ、かなりマジカルな方法ながらできるとのこと。 java - Gson TypeToken with dynamic ArrayList item type - Stack Overflow というわけで以下のようなユーティリティ
次のページ
このページを最初にブックマークしてみませんか?
『Islands in the byte stream』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く