twitterのblock

twitterの公式のWEBページでは、自分がblockしているユーザの一覧、自分のことをブロックしているユーザの一覧などが参照できない。

私はtwitterを使うためにわざわざアプリをインストールするのは面倒なので、パソコンではブラウザで、iPhoneでは公式アプリでtwitterを使っている。

あまりないのだが、SPAMみたいなアカウントとか、個人的にムカっときたときにブロックをすることがある。

自分が相手をブロックしているかどうかは、「ブロックされました」という通知が出たり「あなたをブロックしているユーザ一覧」などのような機能はないが、確認する方法がある(前に聞いたのだがどうやるかは忘れた)。

「ブロックする」というのは、あきらかなSPAMアカウントはいいとして、それ以外のアカウントに対してだと、なんだか自意識過剰な感じがするのでほとぼりがさめたら解除するようにしている。

そのために、APIを呼び出す簡単なスクリプトを作って実行している。

それを使いながら、「どうして公式サイトや公式アプリではブロックに関する機能があまりないのか」と考えたのだが、もし簡単に一括ブロックとか、ブロックしている・されているユーザ一覧などがわかってしまうと、ブロックが濫用されて気に入らない人のフォローが外れてしまい、「誰とでも気軽につながれる」というtwitterのよさが損なわれ、その他のSNSのように閉鎖的になるのを避けるためではないか。

最近は私はブロックするとすぐにそれを解除する。そうすると、あたかもシステムの不具合でいつの間にかフォローがはずれてしまったかのような状態になる。そういう話はよく聞くし、私も何度か経験した。

だがそれはもしかしたら、私がしているように、相手が私をブロックしてすぐ解除したのかもしれない。


10個のマスのうち3個を塗りつぶすパターンをすべて示す

perlでなくもなんでもいいのだが、

「10個のマスのうち3個を塗りつぶすパターンをすべて示す」

というプログラムを書きたい。

マスというのは配列でも文字列でもなんでもよい。

oooxxxxxxx

ooxoxxxxxx

ooxxoxxxxx

....

という事である。

別に必要にせまられているわけではないが、こういうのはプログラムでやるのが得意で、頭の体操にもなるし、と書きかけたのだがうまい案が思いつかない。

再帰をつかうといいのかな?

とりあえず、なんとかできた。

$num = 10;

$x=0;
$y=1;
$z=2;

$count=0;

while($x<($num-2)){
$count++;
for($i=0;$i<$num;$i++){
$array[$i]=0;
}

$array[$x]=1;
$array[$y]=1;
$array[$z]=1;

printf("%8d: ", $count);
print @array;
print "\n";

$z++;
if($z>($num-1)){
$y++;
$z=$y+1;
if($y>($num-2)){
$x++;
$y=$x+1;
$z=$y+1;
}
}
}


もっとエレガントな書き方はあるだろう。

この書き方だと、マス数の変化には対応できるが塗りつぶすマス数の変化には対応できない。

一括置換がうまくいかない

以下のような内容のテキストファイルがある。

aaa
<br>bbb
ccc


これを、以下のように書き換えたい。

aaa<br>bbb
ccc


つまり、

「行頭の<br>」、もしくは、「改行の後の<br>」を単なる<br>に置換したい


のである。

テキストファイルは多数あり、どのファイルに置換対象があるかはわからない。

まず、grepで対象ファイルを探そうと思った。

# grep -E '\n<br>' *.txt
#


これだと検索されない。

次のようにすると検索できる。

# grep -E '^<br>' *.txt
a.txt:<br>bbb
b.txt:<br>bbb


それでは置換してみよう。

# perl -pi -e 's/^<br>/<br>/g' *.txt
#


できない。

以下のような置換はうまくいくから、正規表現の問題だろうか。

# perl -pi -e 's/bbb/orange/g' *.txt
#


「sedでやれば?」と言うかもしれない。

実は以前これをsedでやろうとしてできず、1個ずつエディタを開いて直したことがあるのだ。

perlでやればいいのかと気づいて、やってみたら、やっぱりダメだったのだ。

sedのときは以下のいずれでもダメだった。

# sed -e "s/^<br>/<br>/g" *.txt

# sed -e "s/\n<br>/<br>/g" *.txt


viでは、以下のようにして置換できる。







Perlのワンライナー

ワンライナーはほとんど使わないが、「私、perlならそこそこ書けます」とか言っておいて「ああそう、じゃあこれちょっとワンライナーで書いて」と言われてできないというのはマズいからごく基本的なことはできるようにしておきたい。

perl -e 'for(1..20){print ($_**2); print "\n"};'


と思ったが、-e をつけてシングルクォーテーションで囲んで一行で書くだけか・・・。




twitter oauth

とりあえずできた。

アプリを認証したらクッキーを焼いて2回目からは認証不要とする。

クッキーがあるので認証を経ずにブロック解除のスクリプトに飛ばせる。

ブロック解除のスクリプトでもクッキーを使う。

たぶんセキュリティ上あまりよくない方法な気がするので

ソースとかは載せない。




oauth

oauthは難しい。全然わからん。

perl, php で動くサンプルをマネしてやってきたが、いずれもうまく動かなくなってしまった。

oauthを使うということはつまり、アプリを公開するということである。

自分だけ使うとか、ボットにtweetさせるとかいうだけなら必要ない。

私の場合、ブロックしているアカウントの一覧表示とその解除をしたい。

これだけである。

twitterはblockという機能をあまり使って欲しくないのか、公式ページでは自分が誰をブロックしているのかが簡単にはわからない。私はtwitterで誰かと会話することは皆無といってよいので、ケンカしたり中傷されたりという理由でブロックするのではない。インチキ商売のユーザーとか、フォローしたボットがフォローしてきたが飽きた時とかに使う。

followされるのが嫌なときにもブロックする。ただし、ずっとブロックしたままだとなんだか意識しているようでイヤなので、すぐにブロックを解除する。こうすると、あたかもtwitterの不具合でfollowが外れてしまったかのように見える。

そんなことをしたい。

pythonのtweepyというモジュールでやってみた。

WEBからあるサンプルを見つけて動くことを確認した。

oauthには2組のアカウント(idとパスワードの組み合わせ)を使用する。

consumer key と access token である。

consumer keyはアプリ側で用意しておく。

アプリ利用者は access tokenを取得する必要がある。

このときに自分のtwitterアカウントのIDとパスワードを入力し、access tokenを得て、twitter apiを使用する。




今回参考にしたサンプルでは、2つのスクリプトが動く。

最初のスクリプトではcosumer tokenとsecretを使用して認証のためのURLを取得し、そこにリダイレクトさせる。

http://api.twitter.com/oauth/authenticate?oauth_token=xxxxxx...


アプリを利用するユーザーは自分のtwitterアカウントでログインする。

すると、アプリ開発者が設定したcallback urlにリダイレクトされる。

この時に、callback urlにはoauth_tokenと oauth_verifierというものが付加されている。

アプリケーションは、oauth_tokenと、request secretから request tokenを得、

oauth verifierからaccess tokenを得る。

ここまで来れば、ユーザーにAPIを利用させることができる。

とりあえずaccess tokenを得てapiを動かすことはできるのだが、そのあとでいろいろ困っている。

ブロックしているユーザーの一覧は表示できた。

次にやりたいのはこれらのユーザーのブロック解除である。

ブロック解除するにはそれをおこなう別のスクリプトを動作させる必要がある。

つまり、認証状態を維持して、ブロック解除するスクリプトに渡さねばならないのだ。

どうやるのだろう?クッキーに保存するのか?

このへんはセッション管理で、oauthとはまた別の話か。

自分だけで使うときはaccess tokenをハードコーディングして渡している。

それを動的にやるだけか。

以下がハードコーディングの場合。

import tweepy
consumer_key = '***'
consumer_secret = ' *** '
access_key = ' *** '
access_secret = ' *** '
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_key, access_secret)
api = tweepy.API(auth)
print = api.me().name


tweepy.OAuthHandlerを呼んだ後で、

get_authorization_urlを呼んで認証させると、

oauth_tokenとoauth_verifierが取得できて、

それらを使ってaccess_tokenとaccess_token_secretを得ると。




とりあえず、簡単なセッション管理をした。

access tokenとaccess token secretを取得したらそれをクッキーに保存する。

クッキーにtokenが保存されていたら認証ページへのリダイレクトをせずに、

callback urlへ飛ばす。

access tokenなんかをクッキーに保存すべきじゃないのかな?




hashを値の降順にソートして2次元配列にして返す


sub descend_hash {
my ($hash_ref) = @_;
my @tmp;
my @sorted;

foreach my $name (sort { $$hash_ref{$b} <=> $$hash_ref{$a} } keys %$hash_ref){
push @tmp, $name;
push @tmp, $$hash_ref{$name};
push @sorted, [@tmp];
@tmp = ();
}
return @sorted;
}


ハッシュのリファレンスを渡す。

デリファレンスをしてソートする。

ハッシュのキーと値を配列に格納する。

格納した配列を[]で囲み、無名配列として戻り値となる配列に格納するのがポイントである。

ここで配列のリファレンスである \@tmp を格納すると、

次の @tmp = (); で格納した配列がクリアされてしまう。

この辺は「プログラミングPerl」に書いてある。

というか、最初リファレンスで格納しようとしてうまくいかなかったので参照した。




使い方

my @array = util::descend_hash(\%myhash);
print '<table>';
foreach(@array){
print '<tr>';
foreach(@$_){
print '<td>';
print ;
print '</td>';
}
print '</tr>';
}
print '</table>';


@arrayに格納されているのは配列のリファレンスなので、

@$_ というふうにデリファレンスしてprintする。

各要素に直接アクセスするには $$_[0]というふうにする。




ログ解析

ボットを除いたアクセスを解析してみた。

サーチエンジンはGoogleが6割、yahooが3割、ezが8パーセント、bingが2パーセント。

実はこの4つしか数えていないのだが、私のサイトにはざっと見た感じこれ以外の検索エンジンからのアクセスはない。

ブラウザはIE9がトップで18%。次がAndroidのMobile Safari、つまりiPhoneでないスマホか。16%。firefoxが14%、Safariが13%。IE8が12%、Chromeが10%。MSIE10.0からのアクセスがあった。

Chromeが意外に少ない・・・。私はChromeを使っている。

IEはアドレスバー兼検索窓がたくさんタブを開くと小さくなってしまうのがイヤだ。

あとUIの雰囲気がイヤだ。だいぶ少なくなったがIEじゃないと使えないサイトがけっこうあるのでそのときだけ仕方なく使う。

OSはWin7が34%でトップ。次はXPとAndroidが同点でそれぞれ16%。iPhoneは9%。au携帯が8%、Mac OSが4.5%。Linux,BSDは全部あわせて1%くらい。

twitterなんかだとほとんどの人がマックを使ってるかのようにみんなマックマックと言っているのだが実際のシェアはそうでもないようだ。

ドメインはocnが12%でトップ。その次が spmode.ne.jpで、これはドコモである。ドコモの携帯かスマホでWifi経由じゃないやつか?11%あった。次がezwebで9%、次がpanda-worldつまりソフトバンクのiPhoneで6%。


GDでグラフを描く

GDをインストールする。

あまり使いたくはなかったのだが・・・

棒グラフくらいなら小さな画像ファイルを並べてやっていたが、

円グラフを描きたくなったので。

perl -MCPAN -e shell

で install GD とやるとエラーがでる。

ネットを検索して、事前に

yum install gd-devel

が必要だと知る。




グラフを描いてみたが、思ったほど有用ではない。

パーセンテージが数字で出れば十分。

ログ解析で、ブラウザ、OS、ドメイン名などを数えてみた。

そして、「ハッシュを件数の降順に表示する」が頻発した。

これはライブラリ化したい。

こないだ立ち読みした「pythonクックブック」には、

ディクショナリの値でソート、を、クラスで実装する方法が紹介されていた。

perlでもできるよね?

とりあえずは、ハッシュのリファレンスを渡して、値の降順で並び替えたハッシュが返ってくればいい。


リファレンスの用途

リファレンスの使い方はだいたいわかったが、疑問がわいた。

「サブルーチンに文字列をそのまま渡さずにリファレンスで渡すべきか」
ということである。

直感的に、リファレンスで渡した方がよい事はあっても悪いことはない、と思う。

直接渡すと、サブルーチンでその文字列のコピーを持つから、文字列をコピーする時間がかかり、文字列用のメモリ領域も余計に取る、のではないだろうか?

実際に試してみても速度の変化は確認できなかったが、「続初めてのPerl」に以下のような記述があるので、私の考えは間違っていないと思う。
Perlは、@_を作るために、配列のすべての中身をコピーしなければなりません。要素が少なければ問題はありませんが、配列が大きくなったときには、サブルーチンに渡すためだけにデータをコピーするのは少し無駄です。

sprintfで%のエスケープ

ログ解析で以下のようにして 「15.2%」とかいう風に表示しようとした。

sprintf("%.1f%", $hoge / $sum * 100);


すると、意図通りに表示はされるのだが以下のメッセージがログに書かれた。

Invalid conversion in sprintf: end of string...


%をエスケープしないとダメか、と \%と書いたがダメで、

%%とするのだった。

sprintf("%.1f%%", $hoge / $sum * 100);

rubyをやってみる

rubyもやってみよう。

2.0.0 が最新版とのことなので wgetでダウンロード。

インストール方法は、と調べると yum でできるのか・・・

が、yumだと 1.8.7で、前の前のバージョンということで、

やっぱり 2.0.0を入れる。

configure

make

make install

けっこう時間がかかる。そういえばphpもpythonもyumでやったような記憶がある。たくさんのcompileがおこなわれている・・・。言語をソースからインストールするとこんなものなのか。

ruby と言えば rails

railsも入れる。

gem というのを使ってインストールする。

gem install rails

バージョンをメモしておこう。

# ruby -v

ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-linux]

# gem -v

2.0.0

# rails -v

Rails 3.2.12

インストール中に特に問題はなし。

railsインストール中に2回質問がきたが y で答える。

rdoc's executable "rdoc" conflicts with /usr/local/bin/rdoc
Overwrite the executable? [yN]  y
rdoc's executable "ri" conflicts with /usr/local/bin/ri
Overwrite the executable? [yN]  y
Depending on your version of ruby, you may need to install ruby rdoc/ri data:


ためしに環境変数を表示してみる。

そして REMOTE_ADDRで gethostbyaddrをやってみると、

返ってくるhostnameがおかしい・・・。

まあいいや。

じゃあmecab-rubyを入れよう。

0.994

https://code.google.com/p/mecab/downloads/list

ダウンロードサイトが検索にひっかからないので貼っておく。

rubyのボットスクリプトもpythonと同様、crontabに設定すると動かない。

今度は何もエラーが出ない。

似たようなことで悩んでる人がたくさんいるけど、

どれもなぜそうなってなぜ解決するのかがいまいち腑に落ちない。

#!/usr/local/bin/ruby
require 'rubygems'
require 'twitter'

YOUR_CONSUMER_KEY = "xxxxxxxx"
YOUR_CONSUMER_SECRET = "xxxxxxxxxx"
YOUR_OAUTH_TOKEN = "xxxxxxxxxxxxxx"
YOUR_OAUTH_TOKEN_SECRET = "xxxxxxxxxxxxxx"

Twitter.configure do |config|
config.consumer_key = YOUR_CONSUMER_KEY
config.consumer_secret = YOUR_CONSUMER_SECRET
config.oauth_token = YOUR_OAUTH_TOKEN
config.oauth_token_secret = YOUR_OAUTH_TOKEN_SECRET
end

client = Twitter::Client.new

client.update("こんにちわー")


perlだけはいけるんだよな・・・

なんでかな・・・




cronだと動かなくなるpythonスクリプト

昨日直したのだがやっぱり動かない。

/var/log/messagesに以下のようなログが。

Mar  7 10:13:01 xxxxxxxx abrt: detected unhandled Python exception in '/hoge/hoge/hoge.py'
Mar  7 10:13:01 xxxxxxxx abrt: can't communicate with ABRT daemon, is it running? [Errno 2] No such file or directory

crontabで指定しているスクリプトは /hoge/hoge/hoge.shで、
/hoge/hoge/hoge.py というのは、sh内で呼んでいるpythonのスクリプトだ。
ルートディレクトリで /hoge/hoge/hoge.sh とやると動く。
hoge.pyを、print文一行だけにすると動く。
ということはpythonスクリプトの内容のせいか。
"No such file or directory" とあるが、何に対してなのか?
スクリプトの内容を変えると動くということは、
スクリプト内で開いているファイルだろう。
でも、ルートディレクトリで /hoge/hoge/hoge.sh とやって問題なく動くからな・・・・
どうしようもない・・・

これも頭の隅においとく。

検索後抽出アルゴリズムの改善

perlで書いたcgiをpythonに移植していて、元のコードのアラが見えたので直した。

これはperlだから、pythonだからどうこう以前の問題である。

ログのrefererから検索語を抽出するところである。

主にしていることは以下の通りである。



  • 検索エンジンの識別

  • 検索キーワードの抽出

  • 検索キーワードのURLデコード

  • URLデコードした文字列の文字コード識別(utf8以外)




ちょっと困ったのは文字コードの識別である。

ほとんどはutf8なのだが、EZの検索だとsjisになる。

これはEZの場合無条件にsijisとしてデコードするのでよい。

問題は、googleでもsjisの場合があることである。

referer内に「Shift_jis」などのキーワードがくっついている場合はそれを見てsjisと判断できるが、そのようなキーワードがないのにsjisの場合がまれにだが、ある。

pythonの場合、「utf8でデコードしてエラーを例外で捕捉しエラーならsjisでデコードし失敗したら不明」という風にした。

perlの場合、Encode::decodeでsjisの文字列をutf8でデコードしてもエラーにならない。

それじゃあ、と、Encode::Guessを使ってみる。

必ずではないがutf8の文字列をguessさせるとエラーになる場合がある。shiftjisの判別は成功するようである。

そこで、エラーは例外で捕捉し、guessに失敗した場合は何もせず、成功してshiftjisだったらshiftjisでデコード、という風にした。

最近のログだと、検索エンジンはgoogle, yahoo, ez, bingのみだ。ezが結構多い。

goo.ne.jpとか baiduとかはもう来なくなった。

数えてみたら、google 60%、yahoo 30%、ez 8%、bing 2% だった。

これをグラフで出すcgiもあとで作ろう。




pythonはいい

pythonはいい。

何がどういいのかを説明するのは難しいが、いろんな新しいアイディアがうかんでそれが即実現できる。

オブジェクトがどうとか型がどうだとかより、それが一番大事なことだ。




importのエラー

twitterボットのスクリプトをpythonで書いて動くことを確認してcronで動かす。
翌日、動いてないことが発覚した。
python botscript.py だと動くのだが、
実行権限をつけて ./botscript.py とやると、import tweepyがエラーになる。

ImportError: No module named tweepy

sys.path.append('/usr/local/lib/python2.7/site-packages/')

か、と思って追加したがダメ。
見てみると MeCab.py はあるが、tweepy.py がない。 
tweepy-2.0-py2.7.egg というのがある。
tweepy.pyを探すがどこにもない。

あきらめてshスクリプトを作って逃げる。
eggの中のファイルをどっかにコピーすればいけるなんて情報があったが、
そんなことするのはまっぴらゴメンだよ!
python-twitterでやっても同じようになった。
頭の隅において置こう。いつかわかるさ。


今日はほぼ一日中pythonを書いていた。
やっぱり正規表現の使い方がperlと同じようにできないので、ロジックから作り直した。
おおげさかもしれないが、頭の中身がperl脳だったのがpython脳になって混乱している。
文法的に疑問があった時に対話式に確認できるのは便利だな。

user agentの変更

request = urllib2.Request('http://example.com/')
request.add_header('User-agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64)')
response = urllib2.urlopen(request)
html = response.read()

pythonで配列に要素を追加

ちょっと驚いたのは、配列に要素を追加したときだ。

perlでは pushという動作である。

pythonでは、以下のようにする。


array.append('hoge')


splitは以下のようにする。


array2 = moji.split('\n')


つまり、単なる文字列や配列がすでにオブジェクトであり、メソッドを持っているということである。




着々とperlからpythonへの移行がすすんだ。

正規表現を使うときにperlよりワンクッション入るような感じがする。

perlでサブルーチンにしてハッシュをリファレンスで渡しているところは、

pythonでは関数にディクショナリに **をつけて渡した。

が、参照渡しになるようなので、ディクショナリを戻り値にして渡したディクショナリにかぶせるようにした。

なんかスマートじゃないな。

ちなみに **dic というのをpythonでは何と呼ぶのだろうか?




pythonを覚える

perlしか書けないというのも困るので、pythonを本格的に覚えることにした。

気合をいれるために「初めてのPython」を買ってきた。

パラパラと読んでみたが、非常にマジメな印象である。

Perl本のようなギャグがない。

Perlとpythonについての比較のようなことがコラムとして書いてあったが、

perlは言語学者の作った自由な言語、pythonは数学者の作った統一のとれた言語、

というようなことが指摘されていた。

そしてperlの自由さは保守性が低くなるという欠陥であると。

私はperlが大好きなのだが、やっぱり特殊な言語なのかな。

大規模なシステムを複数の人間で作るようなものには向かないのだろうか。

あくまでもツールとして、とりあえず何かするみたいな使い方に適しているのかな。

さて、まずはpythonでmecabを使えるようにした。

mecab-pythonというバインディングをインストールしようとして、

python setup.py build でエラーになった。

mecab本体とバインディングのバージョンが違っているためだった。

mecabは数ヶ月前に入れたばかりなのだが、結構頻繁にアップデートされているのだな。

mecabのバージョンアップは置いておいて、とりあえずmecab-pythonを同じバージョンにしてやりすごした。

0.994である。

cgiにすると外部モジュールのimportが動かなくなった。

とりあえず

sys.path.append('/usr/local/lib/python2.7/site-packages/')

を書いてしのいだ。




まだ少ししか使っていないが、perlに比べてクソ真面目な印象がある。

というか、やっぱりperlが自由奔放すぎるのだろうか。

そこが好きなんだけど。




日本語をsubstr

perlで、日本語文字列のアタマの部分を決まった文字数だけ取り出す必要があった。
substrコマンドを使ったら、最初の部分が文字化けした。
検索してみると、「use encoding utf8を書けばよい」という情報があったのだが、
最近、「use encodingは非推奨になった」という話を聞いたばかりだったので、それはやりたくなかった。
もう少し検索してみると、要は、substrをする前にデコードしてやればよい、ということであった。

perlでファイルを読むとき

ちょっとハマった。


while(<$fh>){
print;
}


はいいけど、


while(<$fh>){
print $out;
}


はだめ。


while(<$fh>){
print $out $_;
}


としないと。




メモリ故障

Windows7が動いている私の自宅で使用しているパソコンが突然ハングアップしたり電源を入れると起動できず、電源オン・オフを繰り返したりすることが時々あった。

メモリは2GBが2枚刺さっていたのだが、そのうちの1枚を抜いたら落ち着いた。

今までも同じような状況になったことはあったが、フタを開けてホコリを吹いたら治ったりしていたので、たまたまかもしれないと抜いたメモリを戻したら起動しなくなった。

これはメモリの故障だろうということになった。


2GBでも使えないことはないのだが、たくさんウィンドウ(大体ブラウザだが)を開くとモタモタする。

CPUは Intel i3 550 @3.25GHz、Windows7は64bit版のHome Premiumである。

メモリは2GBではきついのか、ということで買いに行った。

以前はよくパーツを買って自作したりちょこちょこ換えたりしていたが、

最近はめっきりごぶさただ。

ハードディスクの空きがなくなる、ということもここ数年すっかり起こらなくなった。

メモリは DDR3の1333が刺さっていたので同じものにする。

さて、どれだけ増やすか。今、2GBなので、最低+2GBだ。

選択肢は

  • 2GB 1枚
  • 2GB 2枚
  • 4GB 1枚
  • 4GB 2枚

秋葉原のあるパーツショップで価格表を見る。
4GB2枚セットで5,6000円である。
たいした額ではないので、4GB2枚にした。
いつも一番安いのを買うのだが、また故障するとイヤなのでちょっと高めで6000円弱の、
Transcendの JM1333KLN-8GK というのにした。

動作は快適になった。
しかし、「多すぎるか」と思った。
合計10GBである。

5枚のタブを開いているchromeが起動している状態でタスクマネージャーを見ると、

物理メモリは、
合計 9911
空きメモリ 7071

とある。

普段使うものをかたっぱしから起動していって、やっと空きメモリが5866となった。

でも動画をいっぺんに3つ表示とかしているので実際にはありえない状態だ。
ネットで検索すると、「32ビットなら2GB、64ビット4GBくらいが必要でそれより多くても無意味」という意見が多い。

なんか、メモリをドカンと大量に使うアプリないかな・・・

uniq 重複行を削除するコマンド

結構な量の、同じ内容の行が複数あるテキストファイルがある。その複数行を一行にしたい。

perlで、hashを使えばできるな・・・と思っていたら、uniq というコマンドで速攻でできた。

ファイルをsortした後、uniq。