タグ TIM Labs
人気順 10 users 50 users 100 users 500 users 1000 users末尾の連続する改行文字を削除する - TIM Labs
文字列が格納されている変数 str から、末尾の連続する改行文字を削除しようとして次のようなコードを書いた(言語:Ruby)。 str.sub(/(\r\n|\r|\n)+\z/, "") 本コードには問題がある。 問題点を指摘せよ。 改善案を提案せよ。 とだけ書いて、答えられる人はどのくらいいるだろうか。これは別に筆記試験というわけでは... 続きを読む
UTF-8の4バイト文字「土の異体字」を処理してくれない - TIM Labs
今回は突然だが、文字コードの話をする。 というのは、ちょっとPythonでAI日本語処理らしきことをやっていたら、引っかかってしまったからである。 図に、3つの土を、そのUTF-8のコードと共に示す。 引っかかった文字は土の異体字の一つの下図の右端の字である。 今では多くのソフトがUTF-8を標準として採用し、たとえ英語圏で開発されたソフトでも日本語処理に困らないことが多い。 しかし、それは、3バ... 続きを読む
プログラミングに数学はどのくらい必要か - TIM Labs
プログラミングするのに数学の知識はあるに越したことはない。 でも、どのくらいあったら良いかの判断は難しい。 プログラミング言語の知識や、用意されているツール・ライブラリ等を使って、まあ少し勉強すれば出来ることをやるだけだったら、高等学校の数学すら不要と思う。 しかし、それでは、理屈は理解しないままプログラムをしているプログラマ程度で終ってしまう。 特に、AIに関するプログラムを書こうと思ってディー... 続きを読む
JavaScript でオセロを実装する(原始モンテカルロAI編) - TIM Labs
問題 以前、オセロの対戦AIの作成しましたが、そこでは実装を簡略化する為に盤面の価値を 盤面の価値 = 自分の石の数 - 相手の石の数 という単純な方法で決めていました。 でも、これには問題があります。 同じ石でも配置場所によって価値は異なるはずです(例: 角は最強)。それが考慮されていません。 ゲーム終盤になってくると石の数が重要になってきます。でも序盤から石の数を重視するのは方向性としておかし... 続きを読む
JavaScript でオセロを実装する(ネット対戦編) - TIM Labs
問題 以前、 JavaScript でオセロを実装 していたのですが、 この実装には一つ大きな問題がありました。 AI相手にゲームをするのは、それはそれで楽しいものの、 やはりこの手のゲームは人間同士で対戦したくなるものです。 一応、あの実装は人間同士で対戦できると言えばできるのですが、 同じPCの前に座って交代しながら操作する形になので、色々と不便です。 インターネット全盛のこの時代、やはりネッ... 続きを読む
GHOST 脆弱性は如何様に使うのか - TIM Labs
先日 GHOST と呼ばれる glibc の脆弱性が発表された。なんでも、「リモートから任意のコードを実行できる可能性がある」らしいではないか。しかも様々なプログラムで利用されているライブラリ部分の問題とあって、影響範囲がとても広い。なかなか厄介なことである。 はて、しかし一体全体どうやってリモートから任意のコードを実行しようというのだろう? 話を聞くに、たかが数バイトの情報を範囲外のメモリに書き... 続きを読む
Railsプロジェクトの初期開発フェーズでのDBスキーマ管理を見直す - TIM Labs
DBのスキーマ、皆様どのように管理されているでしょうか。 Railsを利用されている方の多くは、ActiveRecordのマイグレーションを利用して管理をされているかと思います。 私もいままでいくつかのRailsプロジェクトに関わってきましたが、 ほぼ全てのプロジェクトでActiveRecordのDBマイグレーションを利用してきました。 (一部のプロジェクトはActiveRecordを使っていない... 続きを読む
職場で学んだ快適なVim操作のためのtips - TIM Labs
テキスト編集にVimを利用しているのですが、とても奥が深い道具なので一人で使う分には気づかない機能が沢山あります。 日頃職場の先輩方から教わりとても効率的に出来るようになったVimのtipsを、いくつかこの記事にまとめます。 知ってる人は既に使いこなしているものばかりだと思いますが、Vimのそんな便利だけど気付きにくい機能を共有できればと思います。 カーソルの位置を移動する直前に戻す うっかりgg... 続きを読む
Railsなプロジェクトで利用している便利なGem一覧 - TIM Labs
RubyにはGemと呼ばれるサードパーティのライブラリが豊富に存在します。 Gemは大変便利なもので、こういう機能ほしいなと思った際に The Ruby Toolbox や RubyGems.org や Google で検索すると大抵誰かがその機能を持ったGemを作っていたりします。 gemを利用するのも、RubyGems.orgに登録されているものならば gem install xxx # xx... 続きを読む
JavaScript でオセロを実装する(遅延評価編) - TIM Labs
これまでのあらすじ 新人の力量を測るための課題としてオセロの作成を指示したが、 指示した当人が作れないようでは話にならないので実際に作り始めた。 一先ず盤面が4x4で黒も白も人間が指す一人二役の寂しいオセロは実装できたのだが、 快適に遊ぶには大きな問題が潜んでいたのであった。 実は4x4で既に重い問題 実際に前回作成したオセロを実行すると、 ゲームが遊べるようになるまでに割りと待たされます。 それ... 続きを読む
美しいプログラムを書く(業務用Webアプリケーション保守編) - TIM Labs
あらすじ あなたはとある業務用 Web アプリケーションの開発・保守を任されています。 このアプリケーションは ASP.NET を用いて作成されており、 クライアントサイドは一部 jQuery を利用してナウなヤングにバカウケの UI を実装しています。 さて、今回は 商品情報の変更履歴を一覧表示する。 一覧から2つのバージョンを選んで差分を表示できるようにする。 という機能を実装することになりま... 続きを読む
僕が一番 Vim のタブページをうまく使えるんだ(GNU screen 連携編) - TIM Labs
問題 僕が一番 Vim のタブページをうまく使えるんだ(カレントディレクトリ編) で述べたように、 Vimのタブページはとても便利ですが、 ちょっと工夫するだけでさらに便利になります。 ところで、一般に Vim を使うような方は黒い画面を眺める機会が多いと思います。 また、端末をより便利に使うために GNU screen 等の端末マルチプレクサーを使用している方も多くいるはずです。 すると、 Vi... 続きを読む
Rubyのデバッグに役立つ便利なPryの拡張まとめ | ましましブログ
Rubyistのみなさん,Pryはご存知でしょうか. Pryとは,最近話題のirb上位互換の高機能インタプリタです. 簡単な解説は以前に自分でも書きましたが, こちらの記事がよくまとまっていると思います. Rubyistよ、irbを捨ててPryを使おう - TIM Labs 実際に使ってるところをscreencastで見てみると,より凄さが分かると思います. Pry Screencast on V... 続きを読む
僕が一番 Vim の正規表現をうまく使えるんだ(\zs \ze 編) - TIM Labs
問題 Vim の正規表現 はとても豊富で、 ベーシックなもの から アドバンスドなもの までかなりの道具が揃っています。 これを駆使すればありとあらゆる......は言い過ぎですが、 世の中のテキスト処理の九分九厘を快適に行うことができます。 ただ、あまりにも数が多いので、一体どこから覚えていけばいいのか困りますし、 :help に記載されているものの中には今後の人生で活用する機会があるかどうか分... 続きを読む
Rubyistよ、irbを捨ててPryを使おう - TIM Labs
結構前からgithubのリポジトリを追いかけている人達には認知されていましたが、RailsCastsでも紹介されたことから、Ruby界で一気に広がりを見せているPryを紹介します。 ちなみに発音はpra'i(ぷらい)です。英単語で「覗く」などを意味します。 今回はそんな便利なPryについて少し紹介したいと思います。 Pryはirbの代わりになるREPL Pryを一言で説明すると、irbと同様にRE... 続きを読む
シェルのワンライナーの再利用性を高めるたった一つの方法 - TIM Labs
問題 シェルはお友達です。 一見すると役に立たないように思えるコマンドでも、 組み合わせ次第で複雑な処理をこなすための道具になります。 例えば head - ファイルの先頭10行を出力する。 cut - ファイルの各行のうち特定の部分を選んで出力する。 shasum - SHA-1 ハッシュ値を出力する。 という、一つ一つでは大して役に立ちそうにないコマンドも、 head /dev/urandom... 続きを読む
bash: readとパイプと環境変数 - TIM Labs
問題 シェル(ただし Bourne Shell 系に限る)はお友達です。 一見すると役に立たないように思えるコマンドでも、 組み合わせ次第で複雑な処理をこなすための道具になります。 例えば行毎に ID が記載されているファイル ids があったとしましょう。 各 ID を SHA1 ハッシュ値に置き換えたものが必要な場合、 以下のコマンドで生成することができます (SHA1 ハッシュ値の算出には ... 続きを読む
Vim Version Manager で複数のバージョンの Vim を簡単に管理する - TIM Labs
問題 ある程度 Vim を常用していると、それなりの頻度で以下のような問題に遭遇します: HEAD を追いかけていたら手ひどいミスに遭遇した。少し昔のパッチレベルにまで巻き戻したい。 最近のバージョンに更新したらプラグインの動作が変わった。どのパッチレベルで問題が起きたか調べたい。 そもそも最近のバージョンに更新するのが何だか面倒。 複数のバージョンを並行して利用できるようにしたい。 しかしこのよ... 続きを読む
gitでアレを元に戻す108の方法 - TIM Labs
以前 gitで一度行った変更をなかったことにする方法4つ を紹介しましたが、 日常的に git を使用していると他にも様々な 「なかったことにしたい」「元に戻したい」 という状況に遭遇します。 そのひとつひとつについて対処方法を紹介していきます。 問題1: ライブラリの新機能を試すためにあれこれ適当なコードを書いてみた。でももう要らない。 解答1: git reset --hard HEAD~{n... 続きを読む
Sphinx + blockdiag で始めるドキュメント生活 @ yokohama.pm 2011/05 - TIM Labs
ちょっと足を伸ばして yokohama.pm で Sphinx と blockdiag の話をしてきました。 続きを読む
モナドを実装する(Python編) - TIM Labs
発端 モナドの正体が分かると、 次はモナドを実装してみたくなるものです。 という訳で試しに Python でモナドを実装してみましょう。 別にどんな言語でも構わないのですが、 クロージャや部分適用が簡単に使えない言語では本質的でないところで苦労する羽目になるので、 今回は Python を使うことにしました。 なお、今回作成した Python によるモナドの実装は GitHub で公開中です。 方... 続きを読む
モナド: お前はもう知っている - TIM Labs
はじめに過去に私がHaskellを学び始めた時、真っ先に疑問に思ったことはモナドの存在だった。当時は全くと言っていいほど理解できなかったが、最近Haskellを学び直してようやく理解することができた(と思う)。という訳で、現時点での私のモナドへの理解を示すためにこの記事を書く。ここではモナドの本質が何なのか概要を示す。正確な説明は数多あるモナドについてのチュートリアルを参照されたい。Hellow ... 続きを読む
Git使いがMercurial使いに転職するとき設定しておくべきMercurial拡張 - TIM Labs
Mercurialは、Merucurial拡張という拡張モジュールを使って、Merucrialの挙動をいろいろ拡張できるようになっています。デフォルトのままだと使いにくいので、Mercurialを使う上で便利にしてくれる拡張を設定しておきましょう。デフォルトでバンドルされているMercurial拡張は、Using Mercurial Extensionsにまとめられています。今回はGit使いがMe... 続きを読む
gitで一度行った変更をなかったことにする方法4つ - TIM Labs
gitでは様々な方法でコミットログを書き換えることができます。その一例として一度行った変更をなかったことにする方法を4つ紹介します。問題1: ライブラリの新機能を試すためにあれこれ適当なコードを書いてみた。でももう要らない。$ $EDITOR$ git commit -am 'foo'$ $EDITOR$ git commit -am 'bar'$ $EDITOR$ git commit -am ... 続きを読む