サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
インタビュー
tyfkda.github.io
所定の回数だけインデクスに応じて何か処理をしてそれぞれの結果を配列にしたいという処理をサクッと書きたいんだけど、 JavaScriptで整数配列を簡単に生成する方法が覚えられなくて毎度ウェブ検索のお世話になっていたので調べた。 結論スプレッドしてmap [...Array(N)].map((_, i) => i) が簡潔さと速度の面でよいと思う。 完 . . (末尾にベンチマークの実行あり) 前書きループを自前で回せば一応できるんだけど、for文を書くのが面倒なのでサクッとmapしたい。 Pythonではrange、Rubyでは...でRangeオブジェクトなるものが簡単に生成できる。 JavaScriptではそのようなものは無いようで、自作する必要がある。 候補実際には整数列を加工した結果を得たいので、rangeの代替を作るだけじゃなくて実際になにか計算させてみる(ここでは自乗i * i
自作Cコンパイラではすべて自分で実装してみるというつもりでCコンパイラ、プリプロセッサ、アセンブラを作ってきたが、ついに欠けている最後の要素だったリンカーを作った。 今まではアセンブラですべてのアセンブリコードを受け取って、マシンコード生成とラベルのアドレスを解決して直接ELF形式の実行ファイルを出力していた。 それでほとんど問題はないんだけど、リンカーが使えるとオブジェクトファイルを生成しておくことで分割コンパイルできるようになりコンパイル時間が短縮できたり、 他のコンパイラの出力結果も使用できるようになるという利点がある。 またリンカーがなくてすべてのコードを一緒にアセンブルしていることにより、ソースファイル中の static 変数や関数でも実際には漏れてしまっているため、プログラム全体で衝突しない名前を使う必要があるという欠点があった。 アセンブラからは実行ファイルだけじゃなくオブジ
Rustでスライスを扱う場合前に進めることはできても、後ろに戻すことができない。 C言語のプログラムから移植するなどでそのような操作をしたい場合にどうしたらいいか調べてみた。 モチベーションC言語で組まれたプログラムをRustで実装する際に、配列の途中を指すようなポインタはスライスで扱うことになると思う。 スライスはC言語でいうところのポインタに加えて長さを保持しているもので(ファットポインタ)、それによって範囲外アクセスが起きないようチェックできる。 ポインタを前に進める場合に対応するには、スライスをさらにスライス取ればいい: でポインタを戻す場合にはどうしたらいいか。 スライスでは後ろに戻した場合の安全性を確認できないため、そのような操作ができない。 ということで、生ポインタの演算に手を出してみた。 生ポインタの操作生ポインタの取得生ポインタを取得するには、参照から as *const
Crafting Interpretersを読んである程度全体の構成はわかったんだけど、クロージャの実装方法はあまりよく理解せずに飛ばしてしまったのでもう一度ちゃんと理解したいと思う。 Loxでのクロージャの実装手法VM版でのクロージャは25章 - Closureで解説されている。 まずVM版がどうやってローカル変数を扱っているかというと、VMに値のスタックを持っていて、値を積んだり取り出したりして行っている。 クロージャを実装しない段階ではスコープの開始・終了や関数呼び出しによるローカル変数の生存期間と、スタック上に配置された値の生存期間が一致している。 スタックを使用することで、新しいローカル変数の追加や関数呼び出し時にも特にヒープ確保を発生させずに行うことができて効率がよい。 しかしクロージャでローカル変数をキャプチャできると話が変わってくる。 スコープを抜けた後にもローカル変数にア
をgccを使ってオブジェクトファイルにコンパイルして内容を見てみる。 セクションヘッダセクションヘッダを見るには readelf -S で、 $ gcc -c const.c $ readelf -S const.o There are 11 section headers, starting at offset 0x208: Section Headers: [Nr] Name Type Address Offset Size EntSize Flags Link Info Align [ 0] NULL 0000000000000000 00000000 0000000000000000 0000000000000000 0 0 0 [ 1] .text PROGBITS 0000000000000000 00000040 000000000000000b 00000000000000
実のところ、ウェブサービスのセッションつーものがどうやって実現されているのかをあまり理解してなかった。 特にRuby on Railsではセッションの内容自体をサーバのDBじゃなくてクッキーに保存するということらしいが、その場合のセキュリティ的なこともあまり自信がなかった。 のでちょっと調べてみた。 先にまとめ Railsではセッションの内容がクッキーでやりとりされる(デフォルトの場合) Rails6 ではクッキーが暗号化されているので、クライアント側で改ざんはできない クッキーには httpOnly が指定されているので、サーバに送られるだけでJavaScriptから読み出されることはない Railsでのセッションの使用方法例えばユーザにログインさせる場合に、なんらかの認証をした後にコントローラでセッションにユーザIDをセット: class SessionsController < Ap
基本ブロックへの分割ローカル変数も物理レジスタに割り付けられるようにするための準備として、仮想レジスタの生存期間を調べる。 そして生存期間を調べやすくするために基本ブロックというものを導入する。 基本ブロック(Basic Block, BB)というのは内部にジャンプ命令がなく、また途中にジャンプで入ってこられない、一連の命令列のことをいう。 基本ブロックへの切り分けは中間表現の出力と同時に行うことができる。 if文などの条件分岐やfor文などのループ構文での飛び先としてラベルを使用していたのを、基本ブロックに変更する。 でジャンプ命令が現れたら中間表現の追加先を次の基本ブロックに変更してやる。 基本ブロックの内部にはジャンプ命令がなくて通常はブロックの終わりで次の基本ブロックに遷移するんだけど、 条件分岐の場合にはブロックの最後に条件分岐命令がきて条件が成り立てばそちらに、成り立たなければ
Androidでデータを保存するときにはデータを文字列に変換して保存したいが、フィールドの追加・削除などのデータ形式が変更された場合にも対応したいので、シリアライズをそのまま使うと問題がある。 プロトコルバッファを使えば柔軟性があってよさそうだけど、導入までに一手間かかる。 というわけで、リフレクションでフィールドを調べる方法を探ってみた。 例えばなにか適当なクラスがあったとして: import java.util.List; class Foo { private int i = 123; protected long l = 9876543210L; public float f = 1.23f; public double d = 1.234567890; public static final String s = "foobar"; public int[] a = { 1, 2
低レイヤを知りたい人のためのCコンパイラ作成入門(以降「低レイヤ」)を参考にして作り始めたCコンパイラがようやくセルフホスティングできるようになったので、 今までの経験をメモしておく。 リポジトリはこちら:https://github.com/tyfkda/xcc 動機XV6という学習用OSをひとまず使えるものにしたいなぁと思っていて、Cコンパイラが動けばXV6上で開発できるようになるのでぜひとも動かしたいと思っていた。 しかし既存のソースだとCからアセンブリを出力するだけで、アセンブラやリンカはgccを使うとかしていることが多くて、そのままだと動かすのが難しいのではないかと思っていた。 「低レイヤ」もその方式なんだけど、それを直接バイナリを出力する方法で実装したらできるのではないかと、始めてみた。 進め方「低レイヤ」では最初に整数1個をコンパイルできるだけというミニマルな状態から始めて、
ウェブサービスである某チャットソフトで、管理者じゃないけどある内容を自動的に投稿したいということがあり、CasperJSを使ってみた。 そもそもはPhantomJSを使おうとしていたんだけど、その上に作られたCasperJSというものがあるというのを見て、そのほうが便利なんだろうとそちらを使ってみた(PhantomJSをちゃんと使っていないので、違いは分かってない)。 インストールnpmでも入れられるみたいだけど、Macではbrewでインストールできる:
先日ガワネイティブのアプリを作ろうと思ってWebViewを組み込んだテストアプリを作ってみた(iOS, Android)。その際クリックに対する反応が悪いのが気になった。 スマホのブラウザではダブルタップによるズームを考慮するためにタップを離してから300msの遅れを待ってから実際にクリックされたという判定を行っているらしい。その性で応答が悪く感じられてしまう。 そこでFastClickというJavaScriptのライブラリを 使って、タップの応答がどう変わるかテストしてみる。 結論ダブルタップが必要ないページにFastClickを組み込むのは有効。 動作デモデモ, コード 1番目が onclick イベントを使ったアイテム、2番目が ontouchend イベントを使ったアイテム、3番目が FastClick を使ったアイテムとなっている。 onclickイベントを使ったものはタップして
ネイティブアプリなんだけどネイティブのコードは極力書かず、 WebViewを使ってhtml+JavaScriptを使ってアプリを組みたい。 今回はiOS, Swiftで作ってみる。 コード ‘16/11/30: UIWebViewからWKWebViewに変更 プロジェクトの作成Xcodeでプロジェクトを新規作成する。 Xcodeを起動して現れるダイアログで Create a new Xcode project > iOS > Application > Single View Application を選び、Nextボタンを押す 「Choose options for your new project」ダイアログで Product Name などの情報を入力 使用言語がObjective-CとSwiftから選べる プロジェクトを保存するパスを指定 Storyboardを使わないようにする単
ネイティブアプリなんだけどネイティブのコードは極力書かず、WebViewを使ってhtml+JavaScriptを使ってアプリを組みたい。今回はAndroid, Javaで作ってみる。 コード ‘16/12/01: 環境をAndroidStudio、使用言語をKotlinに変更しました WebViewを全画面の大きさで配置するレイアウトのxmlで指定する <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.tyfkda.g
// index.html <!DOCTYPE html> <html> <body ng-controller="AppController as app"> <form action="upload" method="POST" enctype="multipart/form-data"> <input type="file" name="upName"> <input type="submit"> </form> </body> </html> // server.js (() => { 'use strict' const express = require('express') const multer = require('multer') const app = express() // アップロードされるファイルの受け取り const upload = multer({de
$ xcode-select -print-path /Applications/Xcode.app/Contents/Developer
PC上でTensorflowを使って学習させて、そのデータを使ってスマホなどで識別だけさせるというときに、データはPythonで通常出力するチェックポイントファイルじゃなくてプロトコルバッファ形式にする必要がある。 TesorFlow: Pythonで学習したデータをAndroidで実行 - Qiitaを参考にして、Variableのevalで値を取り出して、同じ構成なんだけどtf.Variableの代わりにtf.constantを使うようにしたグラフを作成して…ということをやっていたんだけど、面倒だし複雑になってしまう。 TensorFlowで学習済みグラフを保存する方法 | Workpilesに便利な方法が書いてあって、tf. import_graph_defを使う方法と、まさに目的通りのVariableをconstantに置き換える便利関数convert_variables_to_c
iOSのブラウザではオーディオの再生に制限があって、ユーザがタッチなどの操作をした時に1つだけ鳴らすことができて、それ以外の任意のタイミングで鳴らすことができない。これは非常に困る。 SafariやChromeなど通常のブラウザではどうしようもないんだが、アプリ内でUIWebViewを使っている場合にはmediaPlaybackRequiresUserActionプロパティをfalseにしてやればこの制限が解除され、ユーザの操作がなくても好きなタイミングでオーディオを再生できるようになる: let webView: UIWebView = UIWebView() webView.mediaPlaybackRequiresUserAction = false WKWebViewの場合 WKWebViewの場合は WKWebViewConfiguration#requiresUserActio
要約:masterをdevelop、ダミーのブランチをmasterにして、git-flowコマンドラインツールのfeature機能だけを使う git-flowを導入してない、masterをメインのブランチとして使用している単純なgitリポジトリで作業する場合、 git checkout -b feature/xxxxでフィーチャーブランチを作成 変更をコミット git checkout masterでマスターブランチに移動 git merge feature/xxxxで変更をマージ git branch -d feature/xxxxでフィーチャーブランチを削除 などと手作業でしていたが、git-flowコマンドラインツール(またはSourceTreeのGit Flow)を利用できたら3~5がgit flow feature finish xxxx一発でできて楽だ。 そこでmasterブラ
TensorFlowを使ってひらがな+漢字の文字認識を行うプログラムを試してみた。 TensorFlowでのMNIST学習結果を、実際に手書きして試す - すぎゃーんメモがTensorFlowのサンプルで構築するニューラルネットワークに対してインタラクティブに書いた文字を認識させる、ということをしているので、これをベースにさせてもらった。 学習使用したデータは手書教育漢字データベースETL8で、ひらがな75文字+漢字881の合計956文字を160セット分。白黒2値イメージは64x63の解像度。 ニューラルネットワークの構成はDeep MNISTのまま、5x5の畳み込み+最大プーリングを2段、それぞれ32と64フィーチャーを抽出、全結合層で1024次元にしてドロップアウト、最終的にソフトマックスで956次元を出力。 元画像データをMNISTにあわせて28x28にリサイズ。訓練用150、テスト
多層ニューラルネットでBatch Normalizationの検証 - Qiitaでクォートされていた、 バッチ正規化使ってないなら人生損してるで If you aren’t using batch normalization you should というのを見て初めてニューラルネットワークでのバッチ正規化というものを知った。 なんか使うだけでいいことずくめらしいので調べてみた。 イントロ論文はBatch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shiftにある。 中身はよく理解してないけど、学習時のミニバッチごとに、各レイヤーの各要素ごとに正規化して学習させることで内部共変量シフト(Internal Covariate Shift)を減らすことができて、それによって学
ファミコンの音源は矩形波x2+三角波+ノイズという構成なんだけど、さらに矩形波にはデューティ比を変更させるという機能がある。 これをWebAudioで実現するにはどうしたらいいのかと考えていた。 仕組みWebAudioにはオシレータで山と谷が等しい矩形波を生成することができるが、デューティ比を変更するような機能はない。 オシレータを使わずに自分で計算して作ったバッファに波形を構築してやればそういう波形も作れるけど、面倒なのでできればしたくない。 でどうしたものかと思っていたら、実現しているサイトを見つけた: Oscilloscope and Pulse-Width control どうやっているのかソースを見てみると、ノコギリ波を組み合わせて実現していた。 通常のノコギリ波に加えて、ゲインを反転させてデューティ比に合わせてディレイさせたものを組み合わせると、波が打ち消しあって矩形波が作り出
動機LuaのAPIは、Lua内部で扱われる値に関してスタック上であれこれ操作出来るだけで、値自体を直接取得したり作成することはできない。 値を取り出したいときはスタック上の特定の場所にある値の型を調べて、その型の値を取り出すAPIを呼び出す、という具合になっている。 この場合、処理系で扱う値はすべて処理系側で管理されているので、ガベージコレクト(GC)できるのもわからんでもない。 しかしmrubyのAPIではスクリプト内部で扱う値をmrb_valueとしてC言語側に直接取り出せる。 この場合処理系の管理を逃れてしまうことはないのか。 またCの関数でmrubyのオブジェクトを作成した瞬間にGCが走った場合に、まだmrubyで管理している変数からの参照がなくて、解放されてしまったりしないのか。 大昔の事しか知らないけど、Rubyの場合はC側のスタック全部を調べていた(Rubyソースコード完全解
このページを最初にブックマークしてみませんか?
『Kludge Factory』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く