はてなキーワード: EMACSとは
僕はMacユーザだ。最初に買ったのはスケルトンのiMac。FirewireとDVD-ROMがついているやつで、色はグリーンだった。OSはMacOS9.0.2。もう10年近く前の話だ。
僕がMacを買ったのは、ひとえに絵が描きたいからだった。正直Windowsにするかどうか、とても悩んだ。でもその頃買った色彩王国という色の塗り方をプロにインタビューした本では、CG塗りをしている人はMacを使っていた。だから僕もMacを買った。その頃は絵のプロになる気満々だったから、A3までプリントでき、カートリッジを交換すれば同じくA3までスキャンできるプリンターと、とても高かったけどPhotoshop 5.5J、そしてタブレットも一緒に買った。さすがにタブレットまではお金が回らなくて、Favoの一番安い奴になっちゃったけど。本を読んでPhotoshopでの絵の塗り方を勉強した。自分なりにいろいろいじって、デジタルトーンのかけ方を覚えたりもした。それで僕は満足していた。その頃に描いた絵は今もちゃんととってあってpixivにアップしてあったりする。
でもMacに不満がないわけでもなかった。興味本位でプログラミングをやってみたいと思っていたけど、ネット環境もなく大型書店もない田舎住まいの僕にはMacでのプログラミング方法なんて分かんなかった。それに、爆弾がよく出たりとか、どこにファイルを置いたのかすぐ忘れてしまったりとか、そういうところでも不満があった。
そして、絵のプロを目指すとか思っていたのに、いろいろ思う所あって実家を離れ大学に進学した。学科はプログラミングが出来そうな情報系を選んだ。そして大学で、コンピュータ室の管理のアルバイトをすることになった。
そのアルバイトでは、大学で使っているUNIXシステムのユーザサポートと、その他の雑用をやった。雑用用にはWindowsXPだったか2000だったかのマシンを使わせてもらえることになった。そして驚いた。WindowsはMacよりも使いやすかったことに。
ユーザのホームがあってその下にマイドキュメントがあって、とどこにファイルを保存すればいいのか簡単に分かったし、それゆえ作ったファイルが行方不明になってしまうこともなかった。安定性も高かった。
ただ、プログラミングに関しては大学の授業とバイトの兼ね合いで、WindowsではなくUNIXを使ってやることになった。最初に覚えたのはCだ。UNIXの世界に触れたのも、僕にとっては非常に大きなカルチャーショックだった。それまでアイコンをクリックして何かが出てきて、といったGUIの世界しか体験したことのない僕にとって、コマンドを打ち込んであれこれやるというCUIの世界は、なんと言ったらいいんだろうか?効率性とかそういうものも当然感じたけれど、でもそれ以上にコンピュータの原点というか、よりコンピュータの弱いところというか、コンピュータに自分が降りていくというか、そんなことを感じた。変なことを書いたがとにかく、コマンドを使ってファイルを作って消して実行して、自分がどこに居るかということは見た目ではなく自分の頭の中で把握していなければならない、自分の他にもコンピュータのユーザが居る、まるでコンピュータの中のマンションに住んでいるような錯覚を覚える文化に、虜になったとまではいわないが非常に感銘を受けた。
さて、次に買うマシンはどうしよう?と思ったとき、僕はWindowsを買おうと思った。UNIXシステムは大学にあるし、Linuxを入れるにしてもまずはPCを買わなければならない。そう、このとき僕の中で2代目のマシンをMacにするという選択肢は綺麗に消えていた。しかし、そんな僕を変える出来事があった。MacOSXとの出会いだ。
バイト先ではどんな環境のユーザから問い合わせがあるか分からないから出来る限りいろんな環境を揃えなくてはならないという理由で、2台だけだったがMacも置いてあった。僕がMacユーザだと知った技官の方は、そのMacの管理を僕に一任した。そのMacに当時ですら古かったMacOSX10.0が入っていたのだ。
この最初のMacOSXは評判が悪かった。すぐ固まる、落ちる、今までのソフトが使えない、そんな悪評を僕はマックの雑誌で沢山目にしてきた。しかし実際にこのMacOSX10.0をみて、それらの評判がそう的外れなものではないということはすぐわかったが、MacOS9に比べると、Windowsのように自分のホームがあって基本的にファイルがそこに置かれるというところは改善点だと思った。だがそれ以上に僕を魅了したものがあった。ターミナルの存在だ。今までのようにGUIを使ってファイルを作ったり移動したりすることができる。しかもそれをUNIXのように(実際UNIXなのだが)CUIの世界から眺めることもできる。その逆もしかり。それにWindowsでは面倒なUNIXへのログインも、sshを使って簡単にできる。そんなことにとても感動した。そしていろいろ調べているうちに当時最新のMacOSX10.2だったらX11betaも使うことができると知って、技官の方や先生へ直談判した。技術的なことにどん欲な彼らはそれに非常に興味を示し、MacOSX10.2を買ってもらえた。僕は早速それらをインストールし、Mac上でUNIXサーバからEmacsの窓を引っ張ってきた。それだけのことであるが、それがたまらなく楽しかった。いつどこの研究室からどんな問い合わせが来るか分からないから、暇なときはMacを使って勉強しなさい、と言ってもらえ、僕はMacに夢中になった。日本語Texを入れたり、Mac上でCやJavaの勉強をしたりと、それはとても楽しい時間だった。そんな僕は次のマシンもMacにするぞ、と固く心に近い、そしてその通りまたMacを買った。友人達がコンピュータ室にこもってプログラミングの課題をこなしているとき、僕は早々に家に帰って自宅のMacからサーバにログインして課題をこなしたものだ。
今この文章も、当然Macで書いている。今はWeb開発系のバイトをしていて、その上でもMacはいい選択肢だと思っている。ペーペーの僕の遥か上を行く開発チーフ達もうちの会社の場合ほとんどMacだ。ApacheをはじめとしてWeb開発に必要なものはほとんどあらかじめインストールされているし、足りないものはMacPortを使ってすぐにインストールできる。ブラウザでの表示確認にはSafari、Firefoxをはじめとしたモダンブラウザが使えるし、Parallels Desktopを使えばWindowsもインストールでき、そのブラウザからMac側で動かしているWebアプリの表示確認をすることだって出来る(たいていはIEに失望することになるが)。
絵を描きたいというところから始まった僕のMac人生だけれど、Web屋もどきになった今でも重宝している。これからもよっぽどのことがない限り変えることはないだろう。非常に長く主観的な思い入ればっかりの文章を書き連ねてきたけど、これが僕がMacユーザを続けてるわけ。
せっかく書いたから匿名でのせてみるよ
使い方は
必要なものを gem で取ってくるにはこうすればいいよ
長すぎてelispが消えたから続きがあるよ
@echo off setlocal set WD=%~dp0 cd /d %WD% ruby get_movies.rb ruby get_images.rb ruby create_m3u.rb
user: ユーザID password: パスワード ids_file: ids.txt done_file: ids_done.txt movies_dir: movies log4r_config: pre_config: global: INFO loggers: - name: app type: Log4r::Logger level: INFO outputters: - STDOUT - FILE outputters: - name: STDOUT type: Log4r::StdoutOutputter formatter: type: Log4r::PatternFormatter pattern: "%d [%l] %C - %M" date_pattern: "%H:%M:%S" - name: FILE type: Log4r::FileOutputter filename: "#{LOGDIR}/sangels.log" formatter: type: Log4r::PatternFormatter pattern: "%d [%l] %C - %M" date_pattern: "%Y-%m-%d %H:%M:%S"
require 'fileutils' require 'logger' require 'mechanize' BASEDIR = File.dirname($0) require "#{BASEDIR}/util" require "#{BASEDIR}/sangels" $config = load_config(BASEDIR) prepare_logger(BASEDIR) $log = new_logger("get_movies") WWW::Mechanize.log = new_logger("mechanize") WGet.log = $log class IDFile def initialize(file) @file = file unless File.exist?(@file) Fileutils.touch(@file) end end def ids(contains_comment = nil) File.open(@file) {|io| io.to_a.map {|x| x.chomp }.select {|x| if x.empty? nil elsif contains_comment true else not /^\s*\#/ =~ x end } } end def add(id) ids = ids(true) unless ids.any? {|x| x == id} write(ids + [id]) end end def delete(id) ids = ids(true) if ids.any? {|x| x == id} write(ids - [id]) end end def write(ids) File.open(@file, "w") {|io| ids.each {|x| io.puts x} } end end $log.info("BEGIN #{$0} ================") exit_code = 0 begin ids_file = IDFile.new($config.ids_file) done_file = IDFile.new($config.done_file) movies_dir = $config.movies_dir wget = WGet.new sangels = SAngels.new sangels.login($config.user, $config.password) ids_file.ids.each {|id| begin movies = sangels.movies(id) rescue SAngels::Movies::InvalidMoviesError $log.warn("invalid movie id: #{id}") next end dir = File.expand_path(id, movies_dir) movies.each {|link| wget.retrieve(link.href, dir) } expected = movies.movie_links.map{|x| File.basename(x.href)} actual = Dir.glob("#{dir}/*").map {|x| File.basename(x)} if (expected - actual).empty? done_file.add(id) ids_file.delete(id) end } rescue => e $log.error(e) exit_code = 1 end $log.info("END #{$0} (#{exit_code}) ================") exit exit_code
require 'fileutils' require 'logger' require 'mechanize' require 'ostruct' BASEDIR = File.dirname($0) require "#{BASEDIR}/util" require "#{BASEDIR}/sangels" $config = load_config(BASEDIR) prepare_logger(BASEDIR) $log = new_logger("get_images") WWW::Mechanize.log = new_logger("mechanize") WGet.log = $log $log.info("BEGIN #{$0} ================") exit_code = 0 begin movies_dir = $config.movies_dir sangels = SAngels.new sangels.login($config.user, $config.password) thumbnails = sangels.thumbnails Dir.glob("#{movies_dir}/*").each {|dir| next unless File.directory? dir id = File.basename(dir) url = thumbnails.url(id) unless url $log.warn("#{id} is not found") next end path = File.expand_path("00_thumbnail#{File.extname(url)}", dir) next if File.exist? path $log.info("retrieving #{url}") thumbnail = thumbnails.get_file(id) File.open(path, "wb") {|io| io.write(thumbnail)} } rescue => e $log.error(e) exit_code = 1 end $log.info("END #{$0} (#{exit_code}) ================") exit exit_code
BASEDIR = File.dirname($0) require "#{BASEDIR}/util" $config = load_config(BASEDIR) movies_dir = $config.movies_dir Dir.glob("#{movies_dir}/*") {|dir| next unless File.directory? dir name = File.basename(dir) files = Dir.glob("#{dir}/*.wmv").sort File.open("#{movies_dir}/#{name}.m3u", "w") {|io| files.each {|file| io.puts "#{name}/#{File.basename(file)}" } } File.open("#{dir}/00_movies.m3u", "w") {|io| files.each {|file| io.puts "#{File.basename(file)}" } } }
require 'mechanize' require 'hpricot' BASEDIR = File.dirname($0) require "#{BASEDIR}/util" class SAngels HOST = "real2.s-angels.com" LOGIN_URL = "http://#{HOST}/member/" INFO_URL = "http://#{HOST}/teigaku/item.php" THUMBNAILS_URL = "http://#{HOST}/teigaku/" THUMBNAIL_URL = "http://#{HOST}/images/default/thumb/" def initialize() @agent = WWW::Mechanize.new end def login(user, password) login_form = @agent.get(LOGIN_URL).forms.find {|form| form.fields.any? {|field| field.name == "frmLoginid"} } login_form.frmLoginid = user login_form.frmPw = password @agent.submit(login_form) end def movies(id, no_validate = nil) Movies.new(@agent, id, !no_validate) end def thumbnails Thumbnails.new(@agent) end class Thumbnails def initialize(agent) @agent = agent doc = Hpricot(@agent.get_file(THUMBNAILS_URL)) elems = doc.search("div[@class=realthum]/a") @links = Hash( elems.map {|elem| href = elem["href"] id = $1 if /ID=(.+)/ =~ href url = elem.search("img")[0]["src"] [id, url] }) end def get_file(id) @agent.get_file(url(id)) end def url(id) @links[id] end def exist?(id) url(id) end end class Movies class InvalidMoviesError < StandardError end def initialize(agent, id, no_validate) @agent = agent @id = id if !no_validate && !valid? raise InvalidMoviesError end end def info_page_url "#{INFO_URL}?ID=#{@id}" end def info_page @agent.get(info_page_url) end def movies_page @agent.click(info_page.links.find {|link| /P=10/ =~ link.href}) end def movie_links movies_page.links.select {|link| /wmv$/ =~ link.href }.sort {|a, b| File.basename(a.href) <=> File.basename(b.href) } end def valid? info_page.uri.to_s == info_page_url end def each(&block) orig_links = movie_links orig_links.each {|orig_link| link = movie_links.find {|l| File.basename(l.href) == File.basename(orig_link.href)} block.call(link) } end end end
require 'log4r' require 'log4r/yamlconfigurator' require 'singleton' require 'fileutils' require 'ostruct' def Hash(a) Hash[*a.flatten] end def load_config(basedir) OpenStruct.new(File.open("#{basedir}/config.yaml") {|io| YAML.load(io)}) end def new_logger(name) Log4r::Logger.new("app::#{name}") end def prepare_logger(basedir, logdir = nil) logdir ||= basedir Log4r::YamlConfigurator["LOGDIR"] = logdir Log4r::YamlConfigurator.load_yaml_file("#{basedir}/config.yaml") end class NullObject include Singleton def method_missing(message, *arg) NullObject.singleton end end class WGet class << self attr_accessor :log def initialize super @log = NullObject.singleton end end def log self.class.log end def retrieve(url, dir) FileUtils.mkdir_p(dir) file = File.expand_path(File.basename(url), dir) if File.exist?(file) log.info("already retrieved #{url}") return true end tmp = "#{file}.part" log.info("retrieving #{url}") ret = system("wget", "-c", "-O", tmp, url) if ret log.info("retrieving succeeded #{url}") File.rename(tmp, file) else if $? == 0x020000 # Ctrl-C exit($?) else log.error("retrieving failure #{url} (#{$?})") end end return ret end end
初めは小学生の頃か。
実物のスペースインベーダーの記憶はない。
しかし、それを皮切りにアーケードゲームのみならず、ゲームウォッチ、ケームセンター嵐などを経て、ファミコンが登場する「ゲーム」の時代だった。
「ゲーム」がコンピューターゲームの意味になった時代だった。小学生も「コンピューター」にワクワクした。
21世紀はコンピューターにより人工知能ができる。そんな時代だった。
でも、アルファベットを知らない小学生にBASICは難しかった。ぴゅう太がせいぜいだった。
「PRINT」で文字を表示する。「GOTO」で行き先を変える。それは分かった。でも何をすればよいか分からなかった。
だから「ベーマガ」で16進数を打った。でも動かなかった。何度も調べ、直し、試した。デバッグした。
でも動いた。自分の入れた文字で数字でコンピュータが動いた。自分で動かした。動かせた。
高専に進んだ。Turbo Pascalでコラムスもどきを作った。
小学生のころから6年が過ぎていた。
Turbo Cも使った。IDEで使うそれは、インタプリタのノリだった。
FM-Rでレイトレースもした。一晩かけて、エラーが起きていた。
でも、構造化プログラミングを学んだ。ポインタも学んだ。マシン語の知識が役立った。
Solarisも使った。EmacsやXも使った。オブジェクト指向も知らずC++にも触れた。
awkやsedで正規表現を学んだ。そしてperlに出会った。
コラムスもどきを作ってから6年が過ぎていた。
perlで掲示版の書き込みをチェックし、madokaで遊んだ。CGIを書いたりした。
perlと出会ってから6年が過ぎていた。
はてなに出会った。JavaScriptに出会った。
Bookmarklet、greasemonkey、Ajax。オブジェクトだらけだった。
初めはゲームだった。でも最初だけだった。
気が付いたら24年が経っている。
今、pythonで書いている。
ようやく、言語の違いには慣れてきた。でも、まだLISPを使った事はない。
道はまだまだある。未知の世界につながっている。
作りたい物が本当は何かは分からない。作れる物が本当は何かは分からない。
どんなふうに動くのかは分かってない気がするけれど、分かっている事もある。
それが今の私のstatusだ。
via Twitterオタが非オタの彼女にTwitter世界を軽く紹介するための10ユーザ
まあ、どのくらいの数のプログラミング言語オタがそういう彼女をゲットできるかは別にして、
「オタではまったくないんだが、しかし自分のオタ趣味を肯定的に黙認してくれて、
その上で全く知らないプログラミング言語の世界とはなんなのか、ちょっとだけ好奇心持ってる」
ような、ヲタの都合のいい妄想の中に出てきそうな彼女に、プログラミング言語のことを紹介するために
習得させるべき10言語を選んでみたいのだけれど。
(要は「脱オタクファッションガイド」の正反対版だな。彼女にプログラミングを布教するのではなく
相互のコミュニケーションの入口として)
あくまで「入口」なので、アーキテクチャに過度に依存するアセンブラ等の低級言語は避けたい。
あと、いくら基礎といってもBrainf*ckやUnlambdaのような難しすぎるものは避けたい。
ポール・グラハムが『Arc』は外せないと言っても、それはちょっとさすがになあ、と思う。
そういう感じ。
彼女の設定は
ロジカル度が高く、頭はけっこう良い
まあ、いきなりここかよとも思うけれど、「Java以前」を濃縮しきっていて、「Java以後」を決定づけたという点では
ただ、ここでオタトーク全開にしてしまうと、彼女との関係が崩れるかも。
この情報過多な言語について、どれだけさらりと、嫌味にならず濃すぎず、それでいて必要最小限の情報を彼女に
伝えられるかということは、オタ側の「真のコミュニケーション能力」の試験としてはいいタスクだろうと思う。
アレって典型的な「オタクが考える一般人に受け入れられそうなプログラミング言語(そうオタクが思い込んでいるだけ。実際は全然受け入れられない)」そのものという意見には半分賛成・半分反対なのだけれど、それを彼女にぶつけて確かめてみるには一番よさそうな素材なんじゃないのかな。
「プログラミング言語オタとしてはこの二つは“教育用言語”としていいと思うんだけど、率直に言ってどう?」って。
ある種の言語オタが持ってるラムダ計算への憧憬と、ACM監修の関数型言語的純粋さへのこだわりを
彼女に紹介するという意味ではいいなと思うのと、それに加えていかにも参照透過な
の二要素をはじめとして、オタ好きのする要素を言語にちりばめているのが、紹介してみたい理由。
たぶんこれを見た彼女は「Emacsだよね」と言ってくれるかもしれないが、そこが狙いといえば狙い。
この系譜の作品がその後続いていないこと、これがポール・グラハムの間では大人気になったこと、
ポールグラハムがウェブサービスの構築に使って、それがいろんなウェブサービス開発者にも影響しててもおかしくはなさそうなのに、
実際のウェブサービスでこういうのが使われないこと、なんかを非オタ彼女と話してみたいかな、という妄想的願望。
「やっぱりプログラミングはバッチ処理のためのものだよね」という話になったときに、そこで選ぶのは「awk」
でもいいのだけれど、そこでこっちを選んだのは、この言語にかけるラリーとdankogaiの思いが好きだから。
断腸の思いで延ばしに延ばしてそれでも2008年、っていうPerl 6のリリース予定日が、どうしても俺の心をつかんでしまうのは、
そのリリースというイベントへの諦めきれなさがいかにもオタ的だなあと思えてしまうから。
Perlのリリース延期を無駄だとは思わないし、拙速なリリースは無茶だろうとは思うけれど、一方でこれが
GuidoやMatzだったらきっちり予定通りリリースしてしまうだろうとも思う。
なのに、各所に頭下げて迷惑かけてリリースを延期してしまう、というあたり、どうしても
「自分の言語を形作ってきた哲学(TMTOWTDI)が捨てられないオタク」としては、たとえラリーがそういうキャラでなかったとしても、
親近感を禁じ得ない。言語自体の高評価と合わせて、そんなことを彼女に話してみたい。
今の若年層でPostscriptを直で書いたことのある人はそんなにいないと思うのだけれど、だから紹介してみたい。
PDFよりも前の段階で、DTPの哲学とか印刷技法とかはこの作品で頂点に達していたとも言えて、
こういうクオリティのプログラミング言語がエディタで書かれてたんだよ、というのは、
別に俺自身がなんらそこに貢献してなくとも、なんとなくプログラミング言語好きとしては不思議に誇らしいし、
いわゆるJava VMでしかスタック型言語を知らない彼女には見せてあげたいなと思う。
PHPの「HTMLに埋め込み可能な点」あるいは「RDBMSとの接続性」をオタとして教えたい、というお節介焼きから教える、ということではなくて。
「HTMLのテンプレートエンジンを作り続ける」的な感覚が言語オタには共通してあるのかなということを感じていて、
だからこそアメリカ版『Yahoo!』の開発言語はPHP以外ではあり得なかったとも思う。
「MとVとCを分離なんてできない」というオタの感覚が今日さらに強まっているとするなら、その「オタクの気分」の
源はPHPにあったんじゃないか、という、そんな理屈はかけらも口にせずに、
単純に楽しんでもらえるかどうかを見てみたい。
これは地雷だよなあ。地雷が火を噴くか否か、そこのスリルを味わってみたいなあ。
こういう述語論理風味の計算をこういうかたちで言語化して、それが非オタに受け入れられるか
気持ち悪さを誘発するか、というのを見てみたい。
9本まではあっさり決まったんだけど10本目は空白でもいいかな、などと思いつつ、便宜的にC++を選んだ。
Javaから始まってC++で終わるのもそれなりに収まりはいいだろうし、テンプレート以降のメタプログラミング時代
の先駆けとなった言語でもあるし、紹介する価値はあるのだろうけど、もっと他にいい言語がありそうな気もする。
というわけで、俺のこういう意図にそって、もっといい10本目はこんなのどうよ、というのがあったら
教えてください。
「駄目だこの増田は。俺がちゃんとしたリストを作ってやる」というのは大歓迎。
こういう試みそのものに関する意見も聞けたら嬉しい。
ほんとにもう最高。
楽したい人間+ハマり性な人間には、こーゆーカスタマイズがしがし出来るツールが最高なのよ。
エディタならvim。emacsでもいいけど、あんまり詳しくない。
他のツールはカスタマイズ性で見劣りする。
こだわりのない人間にはどんなツールでもオッケーなんだろうね。
オレはこだわるところはこだわる。
ちょっとした不便に気づかないか気づいても甘受してしまうような人間と、今はクリアできなくともなんとか今後の課題にしたいと考える人間。
そこの違いだね。
どっちが得かというのはわからんけどね。
優劣とか損得の問題じゃなく、ただオレはそういう人種だってこと。
追記
vimperatorrcねえ。特筆すべき点はないけど、あえて一部抜粋すれば、こんな感じ。
inoremap <C-1> <Esc>1gt inoremap <C-2> <Esc>2gt inoremap <C-3> <Esc>3gt inoremap <C-4> <Esc>4gt inoremap <C-5> <Esc>5gt inoremap <C-6> <Esc>6gt inoremap <C-7> <Esc>7gt inoremap <C-8> <Esc>8gt inoremap <C-9> <Esc>9gt noremap <BS> H noremap <S-BS> L noremap ,b <Esc>:bmarks -tags= noremap u :o<Space> " ldrc+ldrでoで:open出来ない問題を解決
" wildoptions=auto時に一瞬補完が表示されてウザいmapがある - Dis Communication - 符号無し " http://unsigned.g.hatena.ne.jp/Trapezoid/20080620/1213961754 javascript <<EOM [ [',a',':dialog addbookmark'], [',c',':viewSBMComments -t h'], [',C',':viewSBMComments -t hdl'], [',d',':pindownload'], [',ld',':set ldrc'], [',p',':mb clear-pin'], [',q',':toggleldrc'], [',R',':so ~/_vimperatorrc'], [',r',':res'], [',v',':!vim ~/_vimperatorrc'], ['\\s',':scrapbook'], ['\\S',':scrap'], ['\\f',':firebug'], ['\\d',':dialog downloads'], ['\\p',':tabopen chrome://browser/content/places/places.xul'], ['!',':set invum'], ['B',':ls!'], ['\\a',':addons'], ['\\e',':errorconsole'], ['\\F',':firebugwindow'], ['\\d',':dialog downloads'], ['\\g',':oepnGMpanel'], ['\\G',':toggleGM'], ['e',':note'], ['<F11>',':fullscreen'], ['\\P',':placesnewwin'], ['\\H',':historynewwin'], ['<C-j>',':togglebookmarksidebar'], ['<C-k>',':togglehistorysidebar'], ['<C-l>',':addtoldr'], ['<C-S-Right>',':removerighttabs'], ['<C-S-Tab>',':previousfirebugtab'], [',o',':openselectedlinks'], [',3',':copy titleAndURL'], [',ig',':imageGet'], [',io',':imageOpen'], ['w',':submit'], [',lo',':logout'], // nicontroller.js [',ni',':nicoinfo'], [',np',':nicopause'], [',nm',':nicomute'], [',nv',':nicommentvisible'], [',nz',':nicosize'], [',ns',':nicoseek'], ].forEach(function([key,command]){ liberator.mappings.addUserMap([liberator.modes.NORMAL], [key], "User defined mapping", function () { liberator.execute(command); }, {rhs: key, noremap: true}); }); EOM javascript <<EOM [ ['<C-j>',':togglebookmarksidebar'], ['<C-k>',':togglehistorysidebar'], ].forEach(function([key,command]){ liberator.mappings.addUserMap([liberator.modes.INSERT], [key], "User defined mapping", function () { liberator.execute(command); }, {rhs: key, noremap: true}); }); EOM
javascript <<EOM // nicontroller.js plugin // [N]- // N 秒前にシークする。 // 指定なしの場合 10 秒前。 liberator.mappings.addUserMap( [liberator.modes.NORMAL], ['-'], 'seek by count backward', function(count) { if(count === -1) count = 10; liberator.execute(':nicoseek! ' + '-' + count); }, { flags: liberator.Mappings.flags.COUNT } ); // [N]+ // N 秒後にシークする。 // 指定なしの場合 10 秒後。 liberator.mappings.addUserMap( [liberator.modes.NORMAL], ['+'], 'seek by count forward', function(count) { if(count === -1) count = 10; liberator.execute(':nicoseek! ' + count); }, { flags: liberator.Mappings.flags.COUNT } ); EOM
Vimperatorで;bでリンクを新しいバックグラウンドのタブに開くようにする。
http://anond.hatelabo.jp/20080709195527
も俺の仕業なんだけど、これvimperator本体に実装してくれないかな。
気になる点・これからの課題
窓の杜 - 【NEWS】Firefox 3のスマートロケーションバーに対応した「XUL/Migemo」
http://www.forest.impress.co.jp/article/2008/07/07/xulmigemo0105.html
余談
Index of /
http://vimperator.driftaway.org/
に上がるのはたいてい朝の07:30になっているので、いつからかチェックするのが朝の習慣になった。
おおどうもありがとうございます。
社会人暦は数年あるんですが、この業界に入ったのは今年の3月頃です。全く別職種から。
元々理系なんでCとかFORTRANのスパゲティコードくらいは書いたことがあったという感じでした。
自作PCは昔々に1台作りました。SATAの読み方は最近知りましたw
ジャンルはweb系ではないです。業務系でも組み込み系でもないですが。
ネットワークとDBはさっぱりです。あとGUIもわかりません。これはまずいと思っています…。
あと地味にUNIX系OSもよくわかってないです。
この前valgrindをインストールしようとしてよくわかんなくて諦めましたorz
今日はmakefileが上手く動かなくて発狂しそうになったりもしました。
emacsのキーバインドにも慣れないし、cygwinの日本語化も結局未だに上手く行かず…。
周りが優秀なので焦るばかりです。これは感謝すべきことですが。
プログラム一本で食べていけるとは思えないし、自分のやりたいこととも少し違うので、
プログラミングに関しては中の上から上の下くらいのレベルを目指そうと思っています。
あと1回は転職すると思いますし、今26なので、30までにはどこにでもいけるようになりたいと思っています。
それにしても憶えること多すぎですね…。全体がわかるようになるのはいつになるのか…orz
さあて、viでも使うか……
さあて、これからの時代はやっぱ、Kateだよな。
どっかの統合開発環境みたく、プロジェクトごとに開くファイルを設定できるんだぜ。
ほんとにこの人は議論というものをわかってるのかね。一つの論点を挙げたらそれと心中しないといけないとでも思ってるんだろうか。
じゃあまず撤回するところからはじめろよ。くぐるまたぐらを激しく間違えてんだよ君は。
そういう意味でこの批判は文字通りナンセンス(無意味)。「このような論点が存在する」という主張は「このような価値観こそが正しく、他は全て間違っていると信ずる」というものとは全く異なる。だいたい俺が一度でも「役に立つから良い」などと主張したか?「役に立つものだけが良いものだ」と思っている奴が相手だと想定したから、「ある特定の価値観を認めたしてもこういう論点が存在する」と言ったのだ。それのどこが、俺がその「特定の価値観」を主張したことになるのだ。
これだけ言ってもわからないとしたら、君は論理的思考というものが全くできないと言って然るべきだろうね。
なお、くぐるまたぐらを間違えたことは認めるが、それは君がどういう思想の持ち主だったかを読み違えただけだ。しかし、匿名でものを書いている君が「俺様のことを正しく理解しないとは無礼千万!」などという資格はまるでないぞ。
それもまた極端な価値観だな。文学は神聖にして侵すべからずというのか。芸術的にも価値があり、経済的にも価値があるならなおのことよいではないか。
じゃあ例えば君が美術館の館長で、「芸術なんて無駄なものに金が出せるかボケぇ」ってな思想の持ち主の市長によって予算が激減させられそうになったとき、彼にどう反駁するんだ?芸術に対して経済的有用性を云々するのは冒涜である、と主張して、その結果宗教論争に陥って君は解雇、職員も路頭に迷う、なんてのが理想なのか?それこそ勘違いヒロイズムもいいところだ。職員はいったいどうなるのだ。
これが「世に差別や不正が溢れているとして、そりゃ一凡人に出来ることは少ないが、開き直って加担するような真似は俺には出来んね」といった人間の言葉なんだからお笑いぐさだね。
文化を有用性で測るのは冒涜だとかおっしゃったのはどこの誰様でしたっけねえ。
日本は所詮アジアだよ。それが証拠に、自由主義も民主主義もまるで精神的なところに根付いてなくて、簡単に前時代的な思想に転ぶじゃないか。
差別発言ですな。そう言い切ったあなたが19世紀の人間ならあなたはヘーゲルになれたかもしれない。だが今は21世紀なのでな。ヘーゲルの5693番煎じぐらいのことを言っても「事実関係に反する」と言われて終了。欧米先進国様にもキリスト教原理主義とか移民排斥とか悪しき伝統の宿痾はいくらでもある。
あんたがもしヘーゲルなら、あるいは丸山眞男でもいい、欧米先進国様の良い点だけに憧れを持って、悪い点を等閑視していたとしても、情報の不足として酌量された点はあるだろう。だが現代ではそうはいかないぞ。
アベレージをほどほどに高く保ちつつ、それで足りないようなエリートは海外で一流の教育を受けて来い、って言ってるだけなんだが。
わざわざそんなことをしたってなんのメリットもないし、むしろデメリットしか想定できないと主張しているのがわからんのか。
えーと、それから旧帝大の卒業生が世の中のどれだけの割合になるのか調べてからものを言おうね。
Fortranを知らないなんて一言も言ってないのにねえ。天声でも聞こえたのかなあ。
実践的なことばっかやってんじゃねーか。お前がその実践性を理解できてないだけだ。
釈迦に説法。仮にも俺は工学修士だ。お前ごときがエラそうに言ってる話なんて学ばずとも勝手に覚えたわ。
工学は実践に直結しているに決まってるじゃないか。「実践」のレベルが違うと言っているのだ。誰が講義でEmacsやgrepの使い方なんか教えてるか、馬鹿馬鹿しい。時間を掛ければいつでも必要なだけ身に付けられることをわざわざ貴重な時間をいくらも割いてまで教えるわけがなかろう。
だいたい、線型代数も微積も何も理解できないお前ががあのシラバスの内容を大まかにでも正確に理解できているわけがないんだがね。それのどこが君のいったような意味で「実践的」なのだ?え?
言っておくが、どっかで聞きかじったような言葉を言葉として知っていることと、内容まで理解していることは天と地の差だぞ。誰かがあの内容に沿って作ってくれたライブラリを使ってコーディングすることは「情報工学」じゃないぞ。わかってんのかその違いが。
[admin@sakura2 ~]$ uname -a Linux sakura2 2.6.9-67.0.4.ELsmp #1 SMP Sun Feb 3 07:08:57 EST 2008 i686 athlon i386 GNU/Linux [admin@sakura2 ~]$ cat /etc/issue.net CentOS release 4.6 (Final) Kernel \r on an \m
# yum update # yum remove emacs emacspeak emacs-leim emacs-common # yum remove NetworkManager # yum remove bluez-bluefw bluez-hcidump bluez-libs bluez-utils # yum remove cups cups-libs # yum remove irda-utils isdn4k-utils pcmcia-cs wireless-tools # yum remove wpa_supplicant gpm xinetd # yum remove ppp nfs-utils lksctp-tools autofs # yum remove xorg-x11-libs # yum remove selinux-policy-targeted # yum remove vsftpd # yum clean all
[admin@sakura2 ~]$ uname -a Linux sakura2 2.6.9-67.0.7.ELsmp #1 SMP Sat Mar 15 06:54:55 EDT 2008 i686 athlon i386 GNU/Linux
# rpm -Uvh http://mirror.centos.org/centos/5/os/i386/CentOS/centos-release-notes-5.1.0-2.i386.rpm \ http://mirror.centos.org/centos/5/os/i386/CentOS/centos-release-5-1.0.el5.centos.1.i386.rpm [root@sakura2 admin]# cat /etc/issue.net CentOS release 5 (Final) Kernel \r on an \m # yum update glib procps udev iptables # rpm -Uvh --nodeps http://mirror.centos.org/centos/5/os/i386/CentOS/initscripts-8.45.17.EL-1.el5.centos.1.i386.rpm \ http://mirror.centos.org/centos/5/os/i386/CentOS/mkinitrd-5.1.19.6-19.i386.rpm # rpm -Uvh http://mirror.centos.org/centos/5/os/i386/CentOS/e2fsprogs-1.39-10.el5.i386.rpm \ http://mirror.centos.org/centos/5/os/i386/CentOS/e2fsprogs-libs-1.39-10.el5.i386.rpm \ http://mirror.centos.org/centos/5/os/i386/CentOS/e2fsprogs-devel-1.39-10.el5.i386.rpm
# rpm -Uvh http://mirror.centos.org/centos/5/os/i386/CentOS/kernel-2.6.18-53.el5.i686.rpm
[admin@sakura2 ~]$ uname -a Linux sakura2 2.6.18-53.el5 #1 SMP Mon Nov 12 02:22:48 EST 2007 i686 athlon i386 GNU/Linux # yum clean all [root@sakura2 admin]# yum --version Loading "fastestmirror" plugin 2.4.3 [root@sakura2 admin]# rpm --version RPM version 4.3.3
# yum update Error: Missing Dependency: python-abi = 2.3 is needed by package python-elementtree
# vi /etc/ssh/sshd_config # /etc/init.d/sshd restart
# vi /etc/yum.repos.d/dhozac-vserver.repo
# yum update kernel # yum install util-vserver{,-core,-lib,-sysv,-build}
[admin@sakura2 ~]$ uname -a Linux sakura2 2.6.22.19-vs2.3.0.34.1 #1 SMP Mon Mar 17 05:32:04 EDT 2008 i686 athlon i386 GNU/Linux
# yum update bash screen rsync # /etc/init.d/iptables save # /etc/init.d/iptables start # cat /etc/sysconfig/iptables # Generated by iptables-save v1.3.5 on Mon Mar 24 19:57:07 2008 **filter :INPUT ACCEPT [1067:96557] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [63680:6208436] :e0 - [0:0] -A INPUT -i eth0 -j e0 -A e0 -m state --state RELATED,ESTABLISHED -j ACCEPT -A e0 -p icmp -m icmp --icmp-type 8 -j ACCEPT -A e0 -p tcp -m tcp --dport 22 -j ACCEPT -A e0 -p tcp -m tcp --dport 80 -j ACCEPT -A e0 -p tcp -m tcp --dport 443 -j ACCEPT -A e0 -j REJECT --reject-with icmp-port-unreachable COMMIT # Completed on Mon Mar 24 19:57:07 2008 # Generated by iptables-save v1.3.5 on Mon Mar 24 19:57:07 2008 **nat :PREROUTING ACCEPT [179:10642] :POSTROUTING ACCEPT [213:13895] :OUTPUT ACCEPT [251:16220] -A PREROUTING -s ! 10.0.0.0/255.255.255.0 -p tcp -m tcp --dport NNNN -j DNAT --to-destination 10.0.0.1:22 -A POSTROUTING -s 10.0.0.0/255.255.255.0 -d ! 10.0.0.0/255.255.255.0 -j SNAT --to-source AAA.BBB.CCC.DDD COMMIT # Completed on Mon Mar 24 19:57:07 2008
[root@sakura2 ~]# /usr/sbin/vserver-stat CTX PROC VSZ RSS userTIME sysTIME UPTIME NAME 40013 27 301.5M 73.8M 30m36s31 56m38s90 11d06h56 one 40015 5 10.8M 4.4M 0m28s33 0m12s68 9d04h23 two 40016 2 4.2M 1.3M 0m00s47 0m00s64 0m01s97 three
いやー、Emacsがもてはやされたのは歴史の流れだから。歴史の視点で見ないとわからないよ。
viが比較的エディタの世界にとどまったのに対し、emacsはシェルにヒストリ機能をつけてみたり(bshにはなかった)、gdbにきちんとしたUIをつけてみたり(gdbの生のコマンドはひどい)、マルチウインドウを提供((テキスト画面で!))したりした。
だから、それらが全部洗練されたGUI環境で提供される現代、Emacsが統合環境だとかいっても通じない。結局、Emacsの今の利点は、統合開発環境すら作れそうなくらい強力なEmacs Lispマクロを持っている、ことだけだと思う。それが欲しい人は、それだけでEmacsを唯一絶対神と認めるよ。
だけどオレは win にも emacs (NTemacs) を入れる。
オレは vi はあまり使いこなしていないから、vi はちょっと設定ファイルを CUI で編集するときだけ使う。
よーし、プログラミングやるぞー、というときは emacs を使う。
emacs (vi) を使う理由はいちいち言語ごと、プラットフォームごとに開発環境を変えたくないから。
php → Zend IDE とか C++ → Visual Studio とか Python → ? とか Ruby → ? とかやってらんない。
覚えるべき事の量は多いけど、その分慣れると速いし多くの事ができる。SISCとRISCの違いみたいな。
viは単純な命令セットだけで多くの事をこなそうとしてて、emacsはたくさんの命令セットがあるけど1命令でさくっと大きな問題を処理してくれる。
で、emacsは機能拡張も自分でできちゃうので、より(人間の脳内)メモリを大量消費してより高速(人間の操作量的な意味で)に動作するソフトウェアになっていく。
日本語入力ならviよりEmacsの方が入力しやすい(かもしれない)。
だって、viだとカーソル移動や編集の際にわざわざ日本語入力を切替えないといけなくなるから。
(俺の場合はeggとかなんとか、ディストリビューションごとにemacsの日本語環境の設定が違うので、すんごい混乱した。)
ディストリビューションの設定次第でEmacsが活かされたり、殺されたりしてるような気がする。(そもそも俺自身にEmacsをカスタマイズするだけの気概も無いのだが。)
とかいいつつ、俺は日本語の文章を打つ場合はKDEやGNOMEのテキストエディタを使ってる。
でもEmacsのいくつかのコマンドはbashとかinfoコマンドと多少の互換性があるので覚えておいてもいいかもね。
manの操作はvi寄りだけど。
とか言ってみる。
これなー。よくわからんのよ。何が出来るか箇条書きされてもEmacsだけで出来るすごさってのが分からない。
普通こういうのは作業している人のモニターを眺めたりして「おお、いまのどうやったの?」とか聞いて学んでいくんだけど、Emacsだけは身近に強者がいなかったためにすごさがわかんない。
なんだか寂しいような悔しいような。
横はいり。
なんでEmacsがそこまであれなのかわからんのだけど・・・
SSHごしとかでlinuxにアクセスしてもviでまにあうぐらいの設定編集レベルしかしないから、
Emacsの必要性があまりわからん。