サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
買ってよかったもの
shin.hateblo.jp
あー、毎回watchコマンドとかbuildコマンドとかを打ち込むのはやだなー、ビルドスクリプト書きたいなー、Makefileで十分かCakefileにするかRakefileにするか、よっしゃRakefileにしよう、あれーどういうふうに書けばいいんだっけかなー と、プロジェクトを作る度に思っている気がするので、自分用のメモをまとめることにします。 Rakeについて Rakeは、RoRでヘビーに使われていることで一斉を風靡したMakeみたいなビルドツールです。元々、Jim Weirich氏が作成したサードパーティのユーティリティだったのですが、Ruby 1.9から標準ライブラリに組み込まれたようです*1。 よく参考にするサイト とりあえず以下のサイトを見ておけば間違いないと思います。 Rake Rakeの基本的な使い方まとめ - うなの日記 Rakeの勘所 使い方を一からステップアップで書く
C言語のソースを読んでいると、稀に以下のような感じのフレーズが出てきます。 void doSomething(int unused) { (void)unused; } この(void)unused;は一体なんじゃい、という話なのですが、一言で言えば「コンパイル時のunused variable系warningを減らすためのダミーステートメント」だそうです。gccで言えば、"-W"と"-Wunused"または"-Wall"オプションの併用で、警告が出るのですが、それが抑制されるというわけです(参考)。ちなみに、C++では使わない方が良いようです。 減らす方法は、上記以外にも色々あるようなので、見つけたものを紹介します。 上のコードを単純にマクロにしたもの #define UNUSED_PARAM(x) ((void)(x)) void doSomething(int unused) { U
dragoverイベントをキャンセルしないと、dropイベントが発生しません!*1 以上。 おまけ この仕様ですが、このサイトでいかにクソかについて語られているので、一読をおすすめします。 こういうお話も含んだ、ちゃんとした実装の仕方は「ドラッグ&ドロップ-HTML5のAPI、および、関連仕様」にまとまっています。ご苦労さまです。 *1:んな馬鹿な!!!
以前こういう記事を書きました。 Pythonのwithステートメントのまとめ - $ cat /var/log/shin withを出る時に呼ばれる__exit__メソッドでは、引数として内部で生じた例外を受け取る事ができることを一応記載しているのですが、どういうシチュエーションでこの機能が使われるのか思い浮かばなかったので適当にはぐらかしていました。 が、Pythonのunittestモジュールで実際に使っていることが分かりましたので、どういう使い方なのか紹介したいと思います。 unittestモジュールのどこで使われているのか unittestモジュールは、通常unittest.TestCaseクラスを継承する形で利用されます。継承したクラスでは、TestCaseクラスで定義されている各種assertメソッドを利用することが出来るようになります。そのassertメソッドの1つとして、例
久々の更新です。 この章はかなりきついです。以下を理解するまでに3回ぐらい投げてます。 第8章 関数型パーサー 基本 実際に動かすことができた所のソースコードを載せます。 import Char type Parser a = String -> [(a, String)] -- 入力をそのまま出力にするパーサを生成する関数 -- テキストではreturn ret :: a -> Parser a ret v = \inp -> [(v, inp)] -- 必ず失敗するパーサ failure :: Parser a failure = \inp -> [] -- 入力が空なら失敗。 -- そうでなければ最初の文字を取り、そのまま出力とする文字列パーサ。 item :: Parser Char item = \inp -> case inp of [] -> [] (x : xs) -> [
VimでSCSSを整形したら、閉じ括弧が左端に寄ってしまう現象に見舞われました。 css.vimを入れても、scss-syntax.vimを入れても、vim-css3-syntax.vimを入れても治りません。 さて困った…とここで頼みの綱のstackoverflowです。 This is a quick hack, based on the built-in perl indentation code (in indent/perl.vim). Hopefully you can use it to get what you want to do. See the more detailed comments in either the perl indentation code or another one of the files in the indent directory fo
いわゆるCPAN Authorデビューしたのでその記録。 何作ったのか RNCryptorというAESのベストプラクティス的なファイルフォーマット及びiOSライブラリがあるのですが、 The primary target is Objective-C, but implementations are available in C++, C#, Java, PHP, Python, Javascript, and Ruby. RNCryptor/RNCryptor · GitHub Perl版が無い…ということでRNCryptorフォーマットを取り扱うためのPerlモジュールを作りました。その名もCrypt::RNCryptorです。 余談:暗号化の面倒くさいお話 何故にこんなものを作ったのかというと、最近、Perl・iOS・Androidで共通鍵暗号のAESを扱う機会があったのですが、AE
パス文字列の操作で便利なos.pathモジュールのよく使うものメモ。必要に応じて追記します。 ドキュメント:10.1. os.path — 共通のパス名操作 — Python 2.7ja1 documentation ディレクトリ名取得 os.path.dirname >>> os.path.dirname("../foo/bar/hoge/piyo.txt") '../foo/bar/hoge' 拡張子の取得 os.path.splitext >>> os.path.splitext("../foo/bar/hoge/piyo.txt") ('../foo/bar/hoge/piyo', '.txt') >>> os.path.splitext("../foo/bar/hoge/piyo.txt")[1] '.txt' ファイル名の取得 os.path.basename >>> os.p
Exporterを適用したクラスをuse parentで継承した際に、子クラスで@EXPORT*な関数を裸で参照する方法です。 # Base.pm package Base; use strict; use warnings; use parent qw(Exporter); our @EXPORT = qw(foo); sub new { bless +{}, shift } sub foo { print "foo\n" } 1; # main.pl use strict; use warnings; use parent qw(Base); BEGIN { Base->import() } foo; 原理 まず、Exporterはimportクラスメソッドを提供します。このメソッドの中で、指定のメソッドがmixinされます。 一方、useは以下と等価です。 use Module qw
React・Fluxまわりをひと通り触ってみたので所感を徒然。 isomorphicなアプリを書く そこまで大した話ではない。 isomorphicなライブラリをnpmで入れる。 isomorphicなコードを書く。 node.js(io.js)ではそのまま動作。 ブラウザ用にはbrowserify。 所感: bowerのオワコン感。 webpackのtoo complicated感。 altJSの選択 巷のFluxライブラリはReact前提な部分があるので、全てを生JSを書くことはまず考えられない。 ほぼ以下の4択(ハイブリッド可能)。 CoffeeScript 書きやすさ以外に特筆すべき部分はない。 TypeScript 型を書けるという圧倒的ユニークスキル。 JSX The React。ES6のサポート。 ES6 JS (babel, etc.) 次世代JS。 正式サポートされるまで
Type AssertionはC++のdynamic_cast的な機能。 interfaceを別の型にキャストする時に使用。 2通りの受け方がある。 package main import ( "fmt" "errors" ) type MyError struct { i int } func (e *MyError) Error() string { return fmt.Sprintf("i = %d", e.i) } func check1(e error) { myErr, ok := e.(*MyError) if ok { fmt.Println(myErr) } else { fmt.Println("It's not *MyError") } } func check2(e error) { myErr := e.(*MyError) if myErr != nil {
ローダを使わずに自力でテクスチャを生成する時は、needsUpdateをtrueにすることを忘れずに。 texture = new THREE.Texture(img); // img要素 or canvas要素 texture.needsUpdate = true; 内部的にどうなっているかというと、最終的にrenderer.setTextureが呼ばれ、ここでneedsUpdateフラグがチェックされます。 メモ テクスチャの更新 新しく生成する手法。 // update background bgSprite.texture.image = img bgSprite.texture.needsUpdate = true; scene2d.remove(bgSprite); var w = img.width, h = img.height; var texture = new THR
import multiprocessing as mp import multiprocessing.sharedctypes as mpshared def worker(idx: int, queue: mp.Queue, shared_counter): while True: if not queue.get(): break shared_counter[idx] += 1 def main(): NUM_WORKERS = 64 shared_counter = mpshared.RawArray('B', NUM_WORKERS) queues = [mp.Queue() for _ in range(NUM_WORKERS)] workers = [mp.Process(target=worker, args=(i, queues[i], shared_counter))
EPUB3について EPUB3の概要 EPUBの歴史 EPUB3ガイドライン・拡張: 電書協ガイド、KADOKAWA-EPUB 既存のEPUB3ビューワー 事実上のリファレンス実装: iBooks リファレンス実装を目指すOSS: Readium スクロールタイプの実装: BiB/i, Murasaki 日本の2大ビューワー開発会社: ACCESS, INFOCITY その他: Google Play Books, SkyEpub, AnFengDe EPUB SDK, ViewPorter, etc. EPUB3ビューワー実装論 基礎知識 リフロー・非リフロー 縦書・横書き XHTML5, CSS3, DOM4: column-width, Range, etc. ランタイム: Web, iOS, Android レンダリングエンジン: WebKit, Gecko EPUB3の構造 EP
例のごとくAmon2の実装を眺めていた所、Amon2::Web::Dispatcher::RouterBoomの解読で手が止まりました。使い方さえ分かれば無理に読む必要は無いわけですが、どうにも気になってしょうがないので仕組みを調べることにしました。コードの雰囲気からしてメタプログラミングしているということは分かるので、その辺りから掘り下げて調べた結果を、この記事でまとめています。 パッケージのシンボルテーブル シンボルテーブル パッケージのシンボルテーブルは、パッケージ名に二つのコロンを付けた名前の ハッシュに蓄えられます。 つまり、main のシンボルテーブルは %main::、または短く %:: となります。 同様に、先に述べたネストしたパッケージは %OUTER::INNER:: となります。 perlmod - Perl のモジュール (パッケージとシンボルテーブル) - per
iOSでネットワーク通信をするのは初めてだったのでメモ。 iOS Developer Libraryに公式のチュートリアル(日本語版)があるので、まずはこれをこなすのが良いかと思います。 実験環境: MacBook Air 11-inch, Mid 2013 Xcode 5.1.1 iOS7 (Simulator) 基本 iOSもといCocoaではNSURLConnectionクラスを利用してHTTP通信を行うことが出来ます。このクラスですが、時代とともにメソッドが追加されており、今のところ以下の3通りの手段が実装されています。 initWithRequest:...とデリゲートを使う方法。昔からある方法。 sendSynchronousRequest:...で同期的に取得する方法。 sendAsynchronousRequest:...とブロックで非同期的に取得する方法。 NSReque
Linuxにはprocfsという"/proc"以下にシステム情報をファイルで配置してくれる仮想ファイルシステムがあり、CPUやメモリやプロセスその他もろもろの情報を調べるときに重宝します。 一方、Mac OSもといDarwinは、BSD系をベースにしており、またSUSによるUNIX認定を受けていますが、procfsは無いんですね。どうもprocfsはSUSの要件に入っていないようです。 もっとも、procfsが無くても、CPUのコア数とかメモリ容量とか調べるぐらいなら、アップルメニューから「このMacについて」を押せば概要が見れますし、もっと見たければ「詳しい情報...」を押せばその名の通り詳しい情報が出ますし、さらにもっと見たければ「システムレポート」を押せば「システム情報」というアプリが起動してハードウェアの詳細情報を全部見れます。システム情報アプリ(System Informatio
非同期処理のスマートな書き方の1つの解として注目を集めているPromise。 Deferredとか呼ばれたり、実装によってメソッド名とか仕組みとかが微妙に違ったり、しょうがないことですが言語仕様次第で実装方法が変わったりと、今ひとつ安定しないデザパタですが、コアコンセプトはES6のPromiseで抑えておくのが良いんじゃないかなと思います。 // 普通の実装 function incrementAsyncCallback(n, callback) { setTimeout(function() { callback(n+1); }, 100); } // thenメソッドを持つ(=thenable)オブジェクトを返す実装。 function incrementAsyncThenable(n) { var then; setTimeout(function() { if (then) the
今日一日を費やしたので記録しておきます。 発端 今日は、PyOpenGLを使って、OpenGL 3.xでGLSL 1.4のモダンなOpenGLの勉強でもするぜー、と意気揚々としていたのですが、PyOpenGLで扱うGLSLのバージョンを1.2からどうやっても変えることが出来ず、ひたすら調べまくり、一日が終わったというわけでした。 OpenGLのバージョンの変更 言葉の使い方が悪いのでしょうか、「OpenGL バージョン変更」などでググると、新しいマシンを買いましょう、のような結果しか得られません。 ここではMacの話をしますが、Macには、内部的にOpenGLのバージョン(プロファイル)が用意されており、私のMac Book Air 13-inch, Mid 2011では、OpenGL 2.1、GLSL 1.2に設定されています*1。OpenGL 3.xを使うには、これを変更しなければなり
入門記事書けるようなレベルではありません*1ので、タイトルは釣りです。 諸事情により、Perlのモダンな機能の予備知識0の状態で、突如分けわからないOOPなPerlの開発をちょこっとしたので、その知見をまとめたものです。オブジェクト指向のベーシックな概念については省きます。「PerlでOOPってどうやってやるの?」という人の役に立ったら御の字です。 リファレンス まず、これを何となく理解していないと、どうしようもなさそうです。 導入 Perlのリファレンス(参照)というのは、他の言語と同様、ポインタ的なアレのことを意味してます。Perlは、よくよく考えてみると、 %a = (foo => 'bar'); %b = %a; $a{foo} = 'poo'; print $b{foo}; # 'bar' 普通にやると、実体が代入される(ディープコピー)のですね。でも実際問題、参照使わないと高度
調べても情報古かったり、よく分からなかったり、うーん。 Perlの対話モード、なんて洒落たものは標準では存在しない pythonとかirbとか涙ちょちょぎれるぐらい便利ですね。特にPythonの「デフォルトは対話なんだ」という姿勢には感服です。 ではPerlは?というお話ですが、ググると色々あるようではあります。 デバッガを使う perl -de 0 psh perlsh (Term::ReadLine::Gnuから抽出?) pirl (Shell::Perl) re.pl (Devel::REPL) などなど。ググるとperlshの情報が多いようですが、結論から言うと、re.plというのが一番イマドキのようです(?)。re.plはDevel::REPLで入るらしいのでCPANから入れればよいのですが… $ cpanm Devel::REPL ... $ re.pl Failed to l
FormValidator::Lite - search.cpan.org FormValidator::Simpleとは違いcheckの戻り値は$validatorインスタンス自身。 load_function_messageで楽する場合、set_param_messageでパラメータに対する文字列をセットしておかないとget_error_messagesでポシャる。 いろいろ試してみたけれど、中途半端にload_function_messageするよりも、set_messageかset_message_dataでオレオレメッセージを全部ベタ書きするのが一番安全。
Cocoaのマルチスレッド機構について解剖してみました。 実験環境 MacBook Pro Retina, 13-inch, Late 2013 OS X 10.9.2 (Mavericks) NSThread?時代はGCDでしょ! Cocoaには、GCD(Grand Central Dispatch)という新しい並列処理APIが入り、今はこちらを積極的に使うことが推奨されています。とはいえ、CocoaのベースとなっているのはCocoaスレッド(NSThread)なので、NSThreadとNSRunLoopに関する理解は、Cocoaのプログラミングをする上で必須だと思います。 ということで、この記事ではNSThreadを中心に掘り下げていきます。 NSThreadの基本 NSThreadの使い方を簡単に説明すると、適当なクラスに別スレッドで処理するメソッドを用意して、それを適切にinitW
Cocoaの並列処理(GCDとNSOperation/NSOperationQueue)に関するまとめです。この記事ではいわゆる「スレッド」については扱いません。スレッドについては、前に記事を書いたのでそちらを参照してください。 Cocoaのマルチスレッドシステム - $ cat /var/log/shin スレッドによる並列処理からの脱却 スレッドは、歴史のある並列処理のための概念ですが、OSのカーネルの方にも密接に関わりがあるなど、抽象度は低めと言えます。 そこで、Cocoaでは、並列処理のための抽象度の高いインターフェースが提供されるようになりました。それがGCDとNSOperation/NSOperationQueueです。これらを使えば、スレッドを何個作成してタスクをどのように実行するか等の細かいことは、ランタイム側が全て決定してくれるので、ユーザは、並列処理したいタスクを定義し
Getopt::LongとPod::Usageというモジュールと組み合わせるのが良さそうです。Getopt::Longは色々罠があるようで、ちゃんとドキュメントを読んで、:configを設定する必要があります。 サンプル use strict; use warnings; use Getopt::Long qw(:config no_ignore_case bundling auto_help); use Pod::Usage; my %opts = ( num => 5, ); GetOptions(\%opts, qw{ num|n=i output|o=s }) or pod2usage(1); my $target = $ARGV[0]; # ... __END__ =encoding utf-8 =head1 NAME do-something - 何かを処理するスクリプト =h
ここ数日、Amon2を解読していたのですが、結局PSGI/Plackをちゃんと理解してないと話にならないことが分かったので、PSGI/Plackを一から勉強してみました。ということでその記録です。 PSGI/Plackについて PythonにおけるWSGI、RubyにおけるRack、それに相当するのがPerlにおけるPSGIです。このあたりは、前にまとめましたし、他のところでも語り尽くされているネタですので、ここでは省略いたします。 PlackはPSGIなWebアプリケーションを開発するための汎用的なツールキットです。PSGIサーバーのリファレンス実装も含まれています。PSGIサーバー部分は、StarmanやStarletなど、多くのサードパーティ実装があります。Plack自体がよく出来たライブラリ群なので、Amon2やKossyなど、Plackが提供する機能をベースとして、薄く機能拡張を
perlsubクイズ - $ cat /var/log/shin の補足です。 perldocのperlsubには以下の様な記述があります。 ルーチンに渡されるすべての引数は配列 @_ に置かれます。 したがって、ある関数を二つの引数を付けて呼び出したならば、 その引数は $_[0] と $_[1] に格納されます。 配列 @_ は local 配列ですが、その要素は実際の スカラパラメータの別名です。 たとえば $_[0] が更新された場合、対応する引数が更新されます (更新できない場合にはエラーとなります)。 引数が、配列やハッシュの(関数が呼び出された時点では存在してない) 要素であった場合、その要素は(対応する別名が)修正されたり リファレンスが取られたときにのみ作成されます。 (以前の一部のバージョンの Perl では、この要素は代入が行われようが行われまいが 作成されていました
今までコマンドライン引数を処理するのにoptparseを使ってきたのですが、optparseは2.7以降は非推奨というか上位互換のargparseを使いましょうねというお達し(PEP389)が出ています。そんなわけで今書いているプログラムに関して移行作業を行いました。 argparseですが、基本的な使い方は、サンプルコードも多い充実したドキュメントがあるので、そちらを参照しましょう。この記事ではハマったポイントを紹介したいと思います。 コマンド不正の時に終了ではなく例外を投げる argparseでは、指定されたコマンドが不正の場合、プログラムを終了してしまうArgumentParser.errorが呼ばれて、プログラムが落ちます。が、REPLで使い方を勉強するにも、ユニットテスト書くにも、exitされてしまうと困ります。正直これは設計ミスだと思います。 ということで対処法ですが、継承して
$ # re.plで実行 $ sub FOO { 'FOO' } $ my $foo = FOO FOO $ $foo eq FOO ? 'foo' : 'bar' # NG Use of ?PATTERN? without explicit operator is deprecated at (eval 410) line 8. Compile error: Search pattern not terminated or ternary operator parsed as search pattern at (eval 410) line 8.……えっ、どゆこと!? "Use of ?PATTERN? without explicit operator is deprecated" perldocによると*1、 Use of ?PATTERN? without explicit op
次のページ
このページを最初にブックマークしてみませんか?
『$ cat /var/log/shin』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く