FC2ブログ
GEEKy Script Writer [perl and more!]
You should permit the JavaScript!!
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
Metal Coooooooooool
             フラゲクール

      / ./  ̄/     /   /  ̄/       /
   \/    ―/   / /      ./ ―― / /
   /\   _/  _/ /_/  _/    _/ /_/
 /

            /\___/ヽ
           /''''''   '''''':::::::\
          . |(●),   、(●)、.:| +
          |   ,,ノ(、_, )ヽ、,, .::::|
.           |   `-=ニ=- ' .:::::::| +
           \  `ニニ´  .:::::/     +
        ,,.....イ.ヽヽ、ニ__ ーーノ゙-、.
        :   |  '; \_____ ノ.| ヽ i
            |  \/゙(__)\,|  i |
            >   ヽ. ハ  |    |
スポンサーサイト

テーマ:ポルノグラフィティ - ジャンル:音楽

ソフトバンク そういえばそんなんあったな
携帯のお話

ソフトバンクのなんとかがどうこうなって乗り換えられないとかってなってますけど、それ以前に

ほら、ソフトバンクって顧客の個人情報外部に漏れてたじゃない
みんなもう忘れたのかしらね


PHSだけど多分WILLCOMが一番いいんじゃないの
・・・携帯もPHSも持ってないけど

テーマ:SoftBank(ソフトバンクモバイル) - ジャンル:携帯電話・PHS

【一行コード】CとPerlで標準入力からの英字の大文字と小文字を入れ替え
またもやmixiネタ

入力 getchar
出力 putchar
大文字と小文字を逆転するプログラムを書く。


書いた人大学生らしいけど、こんなのもわからんのかと怒る前に今回はCとPerlで書いてみよう
それも中軸の処理は一行で

まずはPerl

map{if($_<91 && $_>64){$_+=32;}elsif($_<123 && $_>96){$_-=32;}printf("%c",$_);}unpack('C*',<>);

んー、まぁこんなもんでしょ
んじゃ次はC

#include <stdio.h>
int main() {
char c;
while(c=getchar()) putchar(c > '@' && c < '[' ? c+32 : c > '`' && c < '{' ? c-32 : c);
return 0;
}

ちょっと無理やりかな?

追記
Perlでもっと短いのでけた

map{printf("%c",(0..64,97..122,91..96,65..90,123..255)[$_]);}unpack('C*',<>);

うーんトリッキー

追記2
更に短く

map{print chr((0..64,97..122,91..96,65..90,123..255)[$_]);}unpack('C*',<>);

もうここまでくると何の処理だかわからんね

追記3
泣きたくなるほどに短いやつ

while(<>){tr/a-zA-Z/A-Za-z/;print;}

そうか、これでよかったんだ

テーマ:プログラミング - ジャンル:コンピュータ

マッチしたやつを置き換える
mixiのC言語とC++言語コミュを覗いてたら僕にもできそうなのが質問として投げ出されていた

はじめまして。
どうしてもわからないC言語の課題があるので質問させていただきます。
―課題―
文字列と照合したいパターン文字列をそれぞれchar型配列sとpに読み込み、関数ptnmchを利用して、文字列sにおいてパターンpと一致する部分を全て*で置き換えて出力するプログラムを作成しなさい。
つまり、shinzoshin zoshinzoと入力して、照合したい文字列がshinzoの場合、
    ******shin zo******
となりたいのです。
よろしくお願い致します。


バグつぶし含め20分ぐらいでかいてみた


#include <stdio.h>
#include <string.h>

int ptnmch(char*,char*);
void str_replace(char*,int,int,char);

int main(int argc,char **argv){
int i = 0;
char hoge[] = ".c";
while(i < argc){
if(ptnmch(argv[i],hoge)){
printf("OK -> %s\n",argv[i]);
}else{
printf("NG -> %s\n",argv[i]);
}
i++;
}
return 0;
}

int ptnmch(char *p,char *s){
int matchflag = 0;
int flag = 0;
int i = strlen(s);
int m = 0;
int l = 0;
while(p[m] != '\0'){
if(p[m] == s[0]){
l = 0;
flag = 1;
while(++l < i){
if(p[m+l] != s[l]){
flag = 0;
break;
}
}
if(flag){
matchflag = 1;
str_replace(p,m,m+i,'*');
}
}
m++;
}
return matchflag;
}

void str_replace(char *str,int s_n,int e_n,char r){
while(s_n < e_n){
str[s_n++] = r;
}
return;
}

実行結果(.cにマッチするようにしてある)

# ./a.out hogehoge.c c.ge .choge.c
NG -> ./a.out
OK -> hogehoge**
NG -> c.ge
OK -> **hoge**

・・・いけてるよね?

そしてmixiではソース公開しないという、ね

テーマ:プログラミング - ジャンル:コンピュータ

itoaとltoaを書いてみた
そういえばlinuxってitoaないんだよなあと思って書いてみた

void itoa(int i,char *str,int c){
int d = c;
int flag = 0;
if(i < 0){
flag = 1;
i *= -1;
}
str[c--] = '\0';
while(i != 0){
str[c--] = i%10 + '0';
i /= 10;
}
if(flag == 1){
str[c--] = '-';
}
d -= c;
while(d--){
str[i++] = str[i + c + 1];
}
}


使用例

#include <stdio.h>

void itoa(int,char*,int);

int main(){
int i = 12345;
char str[20];
itoa(i,str,19);
printf("%s\n",str);
i = -12345;
itoa(i,str,19);
printf("%s\n",str);
return 0;
}

最初の引数が、文字列に変換したい数値
2番目の引数が、文字列のポインタ(宣言時に余裕を持たせるべき)
3番目の引数が、だいたいの桁数(余裕を持たせるべきだけど、文字列の数よりは小さく)

自分で使うことを想定して作ってるから汎用性はあまりないかも(3番目の引数が必要な時点で、ね)
他の関数を使わないことを前提にしてるけど、もうちょいいい方法があるかも
こっそりアドバイスしてくれると嬉しい


*おまけ*
ltoa

void ltoa(long i,char *str,int c){
int d = c;
int flag = 0;
if(i < 0){
flag = 1;
i *= -1;
}
str[c--] = '\0';
while(i != 0){
str[c--] = i%10 + '0';
i /= 10;
}
if(flag == 1){
str[c--] = '-';
}
d -= c;
while(d--){
str[i++] = str[i + c + 1];
}
}

テーマ:プログラミング - ジャンル:コンピュータ

世界史未履修問題
世界史未履修がどうのこうのって奈良の某進学校も騒がれてるけど

太平洋戦争が日本の侵略戦争だって教えるぐらいなら、教えないほうがいいんじゃないの
甚だしきは竹島は韓国の領土とか言って連れてく教師も居るぐらいだし
履修云々より先に内容をどうにかしてよ

あと、なんで日本史が世界史から分断されて教えられてるのかもわからない
消防じゃないんだから、中高では世界から見た日本の歴史を教えるべきじゃないの
いくら日本が島国で歴史的に見ても他国との関わりがそこまで大きくないとは言え、影響は少なからず受けてるし
世界の動向を含めて勉強させるためにも世界史で日本史を教えるべきでしょう
グローバルな観点というか、ねえ

木を見て森を見てないよね
そんなんだから数学的思考能力が低下するんだよ
文部科学省(だっけ?)も、仕事なくしたくないからっていらんことばかりしないで、文部科学省が必要ないぐらいにしっかりしたシステムを築け

それから、消防に英語教えるよりも先にちゃんと国語を叩き込まないとやばいことになるよ
お偉いさんは雲より上しか知らないから大丈夫だと思うんだろうけどね

テーマ:歴史 - ジャンル:学問・文化・芸術

広告に脆弱性があるなんて
Mixiの機能リリースより抜粋
> [広告バナー配信の脆弱性修正]
>
> 一部の広告バナーの配信に脆弱性が確認されたため、10月25日に修正しました。


脆弱性がある広告バナーて!
広告元からリモートコントロールでもされるんでしょうか(w

やっぱりこれしといてよかったかも
Good bye! Jword
以前の記事のコメントcoqさんバッチつくってたのみて、んじゃあいっちょLinux用にもPerlで書くか!と思って他の広告もブロックするようなのを探してるとこんなページを発見したのでこのページのも取り込むようなのを作ってみた

ソース長いのでアップロードしたので右クリック→ファイル名つけて保存でgoodbyejword.plとりネームして保存してちょ
WINDOWS用
LINUX用(Win版との違いは文字コードとデフォルトのhostsの位置を変えてあるだけ)

注意点
Perl5.6以上は多分必要
製作環境はActivePerl5.8.8.817
strict,Socket,FileHandleのモジュールは必要
日本語がやたらファンキーなのはテンションのせいなのでそこら辺は多めに見てよネ!
実行するのは自己責任でよろぴく 一応過去のファイルはリネームして残してるけど

追記
mixiのバナー広告に脆弱性があったようです
え、嫁?
http://haruichi.air-nifty.com/harujp/2006/10/post_19a3.html

比喩ですよね、ハルイチさん
まぁ流行もんだから・・・
佐賀県
佐賀県庁
佐賀県民


千葉滋賀佐賀っ
千葉滋賀佐賀っ
UNIXにみる世代間の断絶
UNIXにみる世代間の断絶

僕の場合はこんな感じ

シェル bash

エディタ vi(vim)

デスクトップ GNOME

技術 枯れた技術を多く使う

プログラミング言語 C,Perlが主

コンポーネント技術 UNIXパイプ

コードの再利用 既存のライブラリを探すのがめんどう

リソースの使い方 貧乏

添付ファイル プレーンテキスト

ファイルの保存形式 行指向のプレインテキスト

ソフトウェアのインストール apt-get

人生 unstable

どちらにも属さない中途半端なtypeのようです
どちらかと言えば、oldtypeの要素が多いみたい

XML,UML,Ruby,Unicode
といったわりと新しい技術はほとんど使ってないなぁそういえば...


トランプをプレイヤーに配る問題
http://ameblo.jp/programming/entry-10001721422.html
の問題をPerlで考えてみました

sub cards {
my $player = shift;
my $cards = shift;
my @res = ();
my $i = 0;
for (1..int(length($cards) / $player)) {
for (0..$player-1) {
$res[$_] .= substr($cards, $i++, 1);
}
}
return @res;
}
配列をプレイヤー数分初期化する処理は書いてませんが、未定義ということでよしとます

想像していたより短く書けました. 掛かった時間は動作確認を除いて5分か6分ぐらいでしょうか. 言語によって所要時間はきっと変わってくるはずです.

これでも、もっと美しいコードがありそうですね

追記:

sub cards{
my $player = shift;
my $cards = shift;
my $i = -1;
my ($t,$p,@strs);
$cards = substr($cards,0, length($cards) - length($cards) % $player );
while( ++$i < $player && !($t=0)){
$strs[$i] .= $p while($p = substr($cards,(($t++)*int($player) + $i),1));
}
return @strs;
}

最初に余りのカードを除いてしまうという方法です
この関数の問題はカードの文字列に'0'があると終了してしまうということですが、0のカードなんてないので問題ないでしょう
fork bom

while(1){ fork(); }

とかいうのをPerlとかCなんかで書いて走らせるとforkしまくっちゃうっていう超有名なfork爆弾

これをローカルのDebianで動かしたらリブートしないと対処できなくなった..当然といえば当然か

fork()はプロセスをコピーするだけあって、CPU時間とかメモリを喰うのでfork()を使ったマルチスレッド?なプログラムを作るときにはfork爆弾にならないよう気をつけましょう..

fork爆弾についての詳しいことは
http://ja.wikipedia.org/wiki/Fork%E7%88%86%E5%BC%BE を参照
m i x i 必 死 だ な
必死すぎるmixiさん
どうやら広告の画像を別のドメインにして、蔓延したこういうのを無にしようとしてるみたい

というわけで例のhostsファイルに

0.0.0.0 img.ads.mixi.jp
0.0.0.0 ads.mixi.jp

も追加しちゃいましょう

追記
なんと広告に脆弱性があったようです
自動で追加してくれるやつ
Perl必要だけどネットからもデータを拾ってくるやつ
FC2ブログを1500倍楽しむためのネタ
今回はこのFC2ブログを1500倍楽しむためのネタを書いていこうと思う
今までのJavaScriptの記事も、大概このFC2ブログをどう高機能にしていくかを題材にしていたが、もう一歩踏み込んだ話
ただ、実装できても実用性があるのかなどの問題があるのでそこら辺には目を瞑って欲しい

あと、だいぶ技術的な話が絡むのでよくわからない人はよくわからないなりにへーすげーと思って流してくれればいい


(1) コメント欄と最新コメントRSSを使った擬似チャット
FC2ブログには最新コメントを何件かXMLで出力してくれる(つーか他のブログでもだいたいそうだが)
それを利用しようじゃないかというもの
まずそのXMLをAJAX使って読み込み、うちのブログで言えば左バー付近にでも出力
その上にでもフォームを出現させ、そこからチャット用に作った記事のコメントに送信できるようにする
あとは定期的に最新コメントのXMLを読み込ませれば擬似的にチャットができる
・・・問題は普通のコメントもチャットのログとして解析されてしまうので、チャットのログであるというフラグ?としてコメントの頭に[CHAT]とでもつければいいのだろうが、それでもやっぱり[CHAT]とつければチャットのログ扱いされるのがどうにかできないか
せめて記事ごとにXML出力してもらえないかな

(2) 今聞いてる曲を表示する
一部(1)とかぶるけども、
http://blog.bulknews.net/cookbook/blosxom/rss/now_playing.html
の記事にあるやつを使い、コメントとして書き込み、AJAXなりで取得

(3) いっそのこと全ての表示もAJAX使っちゃう
ページ移動のアレがなくてスムーズに動き快適?
でも、検索のbotが困るからどうかなあ


・・・1500倍といいつつこれでネタが尽きたわけだが、またなんか思いついたら書いていこうと思う
携帯commerceの時代
ブログや検索エンジンを使った商業戦略はここ数ヶ月って感じだけど、携帯用ページを使っての商業戦略はどのぐらいだろう

最初はチラシに携帯用サイトとかってちらって載ってる程度だったと思うが、QRコードの使用が一般化されて以来(というより携帯でQRコードが解読できるようになって以来)、携帯での商業戦略にも力が入ってきたように思う

ネットの普及率なんかはよくテレビなどでも放送されるが、携帯電話の普及率はどのぐらいなんだろうか
100%なんて数字はありえない
なぜならここに持ってない人間が居るから

要するに

http://blog.amuse.co.jp/tama/p/index.php?itemid=2448
待ちうけ欲しいけど見れないっていうそれだけ
ソースコードのコメント率
小野和俊のブログ:ソースコードのコメント率は20%を切ることが望ましい

コメントを書いたほうがいいか、書かないほうがいいかはよく悩みます。書かなくても分かるだろうと思って書かずに、1年ぐらいに後でそのコードを読むと何やってるのかわからなかったりしますね。

でもそういう場合は、だいたいコードそのものにより分かりやすく書き直せる余地があったりします。

小野さんの考えだと20%を切るのが望ましいということなので、小野さんの記事で紹介されてる
コメント書うんた
というツールを使って、自分の書いたソースコードのコメント率を調べようと思ったけど、このツールはPerlには対応していないみたいなので、コメント行だけ数えるスクリプトを書きました。


#!/usr/bin/perl
use strict;
use warnings;

my $line_code = 0;
my $line_coment = 0;
my $line_all = 0;

while(<>){
$line_all++;
if(/^\s*$/){
next;
}elsif(/^\s*#/){
next if($line_all == 1);
$line_coment++;
next;
}else{
$line_code++;
}
}

print "全体行数\t=> ",$line_all,"\n",
"コード行\t=> ",$line_code,"\n",
"コメント行\t=> ",$line_coment,"\n",
"コメント率(行)\t=> ",100*($line_coment/$line_all),'%',"\n";


使い方は、
上のスクリプトに調べたいPerlスクリプトのファイル名をコマンドライン引数として渡します。

行数しかカウントしてないので、文字数での比率はわかりません

あと、トリッキーなコードについても書こうと思ったんですが、良い例が思いつかなかったのでまたいつか書きます
Linuxが起動途中で止まる
昨日インストールしたDebianですが、時々起動途中に止まってしまいますorz

kernel 2.4だと

PCI : Found IRQ 11 for device 00:0a.1
PCI : Sharing IRQ 11 with 00:0a.0
Redundant entry in serial pci_table. Please send th output of
lspci -vv, this message (115d,000c,8086,2408)
and the manufacturer and name of serial board or modem board
to serial-pci-info@lists.sourceforge.net.

というメッセージが出たところで止まります

なんでここで止まってしまうんだろう...
[Linuxが起動途中で止まる]の続きを読む
記事とコメントに引用していることを示すタグを付加する
というわけで引用のやつ出来ましたよ
以前の、見出しをつけるやつで使っていたgetStringByElement関数をちょいと弄ればいけました

変更後(変更前は以前の記事を見てください)のgetStringByElement

function getStringByElement(element){
var i = -1;
var str = "";
var elm2;
var s = element.childNodes.length;
while(++i < s){
elm2 = element.childNodes.item(i);
if(elm2.hasChildNodes()){
str += getStringByElement(elm2);
}else{
str += (elm2.nodeType == 3) ? elm2.nodeValue : "";
if(elm2.nodeValue && elm2.nodeValue.match(/^>/) ){
var newElm = document.createElement('span');
newElm.style.border = "1px dashed #808080";
newElm.style.backgroundColor = "#f0ffff";
newElm.style.paddingLeft = "5px";
newElm.appendChild(document.createTextNode(elm2.nodeValue));
element.replaceChild(newElm,elm2);
}
}
}
return str;
}

まぁ、わかる人は変えればいいんじゃないかな
ちょっとテスト
なんかコメント欄だけかな?引用符つけても特にspanタグで引用という強調が行われてないのは
というわけで引用符のテスト
>あああほげほげ
>複数行


自動でされないのであればまたJavaScriptでやるしかないな、これだからFC2はツンデレなんだよね!


追記
やっぱされねえww

追記2
つーわけで作った
Debianのインストール
Perlコードの速度比較を再検証するために、使ってないThinkPad X20にDebianを入れた

インストール時の自分なりの注意点なんかをメモしておく

FDから起動してネットワークインストールがいい感じ
http://http.us.debian.org/debian/dists/sarge/main/installer-i386/current//images/floppy/
boot.imgとroot.imgを落としてFDに書き込めばOK.

WindowsでFDにイメージを書き込むにはddコマンドのWindows版があるのでお勧め
http://uranus.it.swin.edu.au/~jn/linux/rawwrite/dd.htm

インストール後にすること
  • とりあえず/etc/environmentをLANG=Cにする
  • apt-get update; apt-get dist-upgrade
  • apt-get install vim (これ重要)
  • apt-get install sudo
  • apt-get install kernel-image-2.6.8-2-686
  • reboot

他にも入れたいパッケージがあったらapt-getで一撃インストール
dselectとかいうツールがあるけど名前すら知らない人もいるんじゃないかなぁ(わら

コリエイターの現実
相変わらずこのブログの人は面白いネタを引っ張ってきますね

知り合いにも日本人だけどコリエイターが居ます
こちらではパクリエイターと呼んでいましたが意味にさほど違いがあるとは思えません
コリエイターのほうが悪質?いやいや、パクリエイターも大概酷かったです

あえて特徴を挙げるとすれば
  • 他人のソースコードをパクる際、インデントも変更しない

  • 他人のソースコードをパクっておいて動かないと文句を垂らす

  • 他人のソースコードをパクるだけパクって引用元の記述もしない

  • 他人のソースコードをパクった後は他の人にそのソースを渡して直せと言ってくる

  • 他人のソースコードをパクったコードを動くように修正しても報酬を1円も出さない

  • 他人のソースコードをパクるのに自分のコード(しかもパクってきたやつ)がパクられるとキれる

  • 他人のソースコードをパクるだけで調べないのでスキルがつかない

  • 他人のソースコードをパクっているのに、改良点などを述べるとキモいと言い出す
なんかどんどん長くなっていくのでここら辺で止めるけど、思い出すだけでむかつきます

追記
トラックバック先の人、二重投稿になってしまいすみません(;´Д`)
さーてPVチェックしないと
我らがTamaちゃんの新曲PVはいつ流れるのやら

PVが流れる可能性が今んとこあるやつをリスト

M!ON
http://www.m-on.jp/index.html

SSTV
http://www.spaceshowertv.com/search/detail.cgi?mu=0052182&ch=0

すんごい待ち遠しいよ待ち遠しい

追記
自動リンクされないみたいなので次は自動リンクさせるのでも書きますか
あな恐ろしきmixiの罠
知らない間に個人情報は盗まれる、プライベートな内容のメッセージも盗み読みされる

こえー

というわけで、せめて個人情報だけでも外部に流出させないようにするための小技
mixiに登録している時点でアレだから殆ど気休めだけど

かの有名?なhostsファイルを編集してみませんかということです

WINXPならC:\WINDOWS\SYSTEM32\DRIVERS\ETC内にあるhostsというファイルをテキストエディタ(メモ帳など)で開き

0.0.0.0 ad.jp.doubleclick.net
0.0.0.0 banner.mixi.jp

を一番下にでも付け加えておけば、個人情報の外部(mixiより外)漏れを防ぐことができ、mixiロゴ横の邪魔な広告画像もさよならしてくれます
ついでに、他のうざい広告も消しちゃいましょう

0.0.0.0 download.jword.jp
0.0.0.0 ad.jp.ap.valuecommerce.com
0.0.0.0 ck.jp.ap.valuecommerce.com
0.0.0.0 hpad.www.infoseek.co.jp
0.0.0.0 ads.lidr.valueclick.jp
0.0.0.0 bc.geocities.yahoo.co.jp

これでうざい広告ともおさらばでき、読み込みバイト数は減り無駄なScriptを回すこともなく快適なネットライフを送ることができる!

とか言うとちょっと古臭いけど、まぁいっか

追記
上のだけじゃ広告出ちゃうようになったので
こっちのもやると吉
ページ内の記事を一覧にする (見出し付き)
というわけで、見出し付きの記事リストのソースを載せてみる。
IEで見るとかなり縦長なのでFireFoxで見ることを勧める。

<script type="text/javascript">
<!--
elm4 = document.getElementsByTagName('div');
elm5 = document.getElementById('Article_List');
bodyelm = document.getElementsByTagName('body').item(0);
brz = window.navigator.appName.match(/^Netscape$/i);
s = 0;
elm5.innerHTML = "";
while(s < elm4.length){
if(elm4.item(s).className == 'mainEntryTitle'){
var elmm = document.createElement('a');
var sr = s;
var st_txt = "";
while(elm4.item(++sr).className == 'mainEntryBody'){}
elmm.setAttribute('href',"#"+""+elm4.item(s).firstChild.name);
var stjc = document.createElement('div');
stjc.appendChild(document.createTextNode(getStringByElement(elm4.item(sr)).substr(0,10) + "......"));
stjc.style.display = "none";
var id = "n_"+s;
stjc.setAttribute('id',id);
stjc.style.border = "1px solid #000000";
stjc.style.backgroundColor = "#ffffff";
bodyelm.appendChild(stjc);
if(brz){
elmm.onmouseover = function(r,event){
return function(e){
open_div(r,e.pageX,e.pageY);
}
}(id);
elmm.onmouseout = function(r){
return function(){
hide_div(r);
}
}(id);
}else{
elmm.onmouseover = function(r){
return function(){
open_div(r);
}
}(id);
elmm.onmouseout = function(r){
return function(){
hide_div(r);
}
}(id);
}
elmm.appendChild(document.createTextNode("● "+elm4.item(s).lastChild.nodeValue));
elm5.appendChild(elmm);
elm5.appendChild(document.createElement('br'));
}
s++;
}
function getStringByElement(element){
var i = -1;
var str = "";
var elm2;
var s = element.childNodes.length;
while(++i < s){
elm2 = element.childNodes.item(i);
if(elm2.hasChildNodes()){
str += getStringByElement(elm2);
}else{
str += (elm2.nodeType == 3) ? elm2.nodeValue : "";
}
}
return str;
}
function open_div(element,e1,e2){
var elems = document.getElementById(element);
var xx = 0;
var yy = 0;
if(!brz){
xx = window.event.clientX;
yy = window.event.clientY;
}else{
xx = e1+"px";
yy = e2+"px";
}
elems.style.position = "absolute";
elems.style.top = yy;
elems.style.left = xx;
elems.style.display = "block";
}
function hide_div(element){
document.getElementById(element).style.display = "none";
}
//-->
</script>


今回はFireFoxのトリッキーな挙動に苦戦した
動作条件は前回と同じ
IE6,FireFox1.07,NN7.1にて確認
例のごとく、面倒なのでこのブログで使われているまま載せている

また、

stjc.appendChild(document.createTextNode(getStringByElement(elm4.item(sr)).substr(0,10) + "......"));

の10を変更すれば、見出しとして出す部分の長さを調節できる
10じゃ短いと思う場合は15とか20ぐらいにしてもいいだろう

追記
引用(頭に>)を分かりやすくするためには?
ちょっとうざいFireFox
ページ内記事リストのところにプレビューとして内容をすこーしだけ表示させるようなものを作ろうとしているのだが、FireFoxだけEventの有効範囲などが違い、上手くいかない
とりあえずIEでは上手くいっているのでとりあえずIEだけやっておくことにした
FireFoxではtitle属性でもつけてやるしかないのか?

追記
なぜかFireFoxでは
obj.style.top
obj.style.left
が正常に作動しない
IEではもちろん、依然使ったページでは正常に作動していたのになぜだろう
obj.style.position

obj.style.displayは正常に作動しているようでますますわからない
topとleftに代入している値をalertで見てみたところ、ちゃんと数値が入っている
・・・バグ?

さらに追記
数値の後ろにpxをつけたところ正常に作動した
どうやら数値を指定するだけではいけないらしい
なぜ以前のページでつけなくても動いたのかがわからないが、そういうことなんだろう
[C] itoh (整数->16進文字列)
初めて、C言語の記事を書きます

今回のコードは、整数から16進数文字列を返す関数です。


#include <stdio.h>
#include <string.h>

char *itoh(int, char *);

int main() {
int num = 0x0ffffffe;
char s[9];
return ( printf("%d => %s", num, itoh(num, s)) ) ? 0 : -1;
}

/* int to hex */
char *itoh(int v, char *s) {
char *p = s;

if (v<0)
return NULL;

while (v) {
*p++ = "0123456789abcdef"[v % 0x10];
v /= 0x10;
}

if (p==s)
*p++ = '0';

*p = '\0';

return strrev(s);
}


itoh()はint型の整数とchar*型のポインタを受け取って、その整数を16進数文字列にしてそのポインタの先へ格納します。

*p++ = "0123456789abcdef"[v % 0x10];
ポイントはここです!(geekポイント60/100ぐらいです)

Cでは、文字列をリテラル表記した場合、それはその文字列が格納されたメモリのアドレス、即ちchar型へのポインタを表しています。
この場合、"0123456789abcdef"は'0'が格納されているアドレスを表しているので、[]で指定した値をそのアドレスに足した
アドレスの内容参照ということになり、例えば、渡された整数が、0x0fの場合0x0f%0x10=0x0fになるので、'0'のアドレスに0x0f足したアドレスは'f'が格納されたアドレスということになるわけです。

あと、何故こーいうitoh()とかitoa()などの関数が渡されたポインタの値をそのまま戻り値にしているんだ?と思われるC初級者の方はこのコードのmain()のコードを見てもらえればわかるとおもいます。: printf("%d => %s", num, itoh(num, s))
Perlコードの速度検証
いままで、
割と汎用的な速度比較実験用スクリプトで様々なPerlのコード
の速度を比較した記事を書きましたが、この検証用のスクリプトに問題があって、
正確な結果になっていません

@func の0番目のサブルーチンだけ他の要素に登録したサブルーチンより遅くなってしまうようです

これは、同じ処理を0-4ぐらいまで書いて実行してみると明らかです

# 引数にはリストを渡す
$func[3] = sub {
my $n = "";
my $i = 0;
$n = $_ while ($_[++$i]);
};

$func[2] = sub {
my $n = "";
my $i = 0;
$n = $_ while ($_[++$i]);
};

$func[0] = sub {
my $n = "";
my $i = 0;
$n = $_ while ($_[++$i]);
};

$func[1] = sub {
my $n = "";
my $i = 0;
$n = $_ while ($_[++$i]);
};


これを実行してもらえば分かると思いますが、
何回か繰り返し測定すると、他と比べて、0が0.001ほど
遅いことがわかるとおもいます

いままでの検証記事を別の方法を考えて測定し直します
が、それまではいいかげんな結果なのでご注意ください


カーリーブレイスなどの位置で速度比較

$func[0] = sub {
my $i = 0;
my $n = "";
while($_[++$i])
{
$n = sprintf "%s", $_ ;
}

};

$func[1] = sub {
my $i = 0;
my $n = "";
while($_[++$i]){
$n = sprintf "%s", $_ ;
}
};

$func[2] = sub {
my $i = 0;
my $n = "";
while ($_[++$i]) {
$n = sprintf "%s", $_ ;
}
};

$func[3] = sub {
my $i = 0;
my $n = "";
$n = sprintf "%s", $_ while($_[++$i]);
};

$func[4] = sub {
my $i = 0;
my $n = "";
$n = sprintf "%s", $_ while ($_[++$i]);
};

$func[5] = sub {
my $i = 0;
my $n = "";
$n = sprintf("%s", $_) while($_[++$i]);
};

$func[6] = sub {
my $i = 0;
my $n = "";
$n = sprintf("%s", $_) while ($_[++$i]);
};


{}や()の位置はプログラマの好みの問題で、書く人に
よって位置がばらばらですが、この{}の位置によって
速度が変わるのかどうか検証してみました

で、上のコード、どれくらい違うと思いますか?

結果は、4,5,6 < 3 < 2 < 1 <0 といった感じですが、
0以外は、ほとんど同じです. 0だけが極端に遅く、
他の関数と0.01ぐらいの差があったりします

{}や()の位置は好みの問題といいますが、その位置で
速度が変わってしまうようです
あくまで自分流の美しさやコーディングスタイルを貫くか、
速度を重視するかは自由なのでこれこそ好みの問題でしょうね
ページ内の記事を一覧にする
今開いているページの記事へのリンクがないのが非常に不便に思ったのでJavaScriptで記事の名前及びページ内リンクを抽出してみることにした

下記のスクリプトをそのままの状態で正常に挙動させるためには
  • ID名がArticle_Listであるブロック要素が存在する

  • 記事の見出しの<div>要素のclass名がmainEntryTitleである

  • elm4,elm5,s,elmmの変数を予約していない
ことを満たしていなければ使えないが、相応のところを変更すればなんら支障なく使えるはずである


<script type="text/javascript">
<!--
elm4 = document.getElementsByTagName('div');
elm5 = document.getElementById('Article_List');
s = 0;
elm5.innerHTML = "";
while(s < elm4.length){
if(elm4.item(s).className == 'mainEntryTitle'){
var elmm = document.createElement('a');
elmm.setAttribute('href',"#"+""+elm4.item(s).firstChild.name);
elmm.appendChild(document.createTextNode("● "+elm4.item(s).lastChild.nodeValue));
elm5.appendChild(elmm);
elm5.appendChild(document.createElement('br'));
}
s++;
}
//-->
</script>



・・・めんどくさかったのでこのブログで使用しているコードと同一のものを載せているが、万が一不具合があるとも限らないのでそこら辺はご留意願いたい
見出し付きでリスト抽出
copyright © 2005 GEEKy Script Writer [perl and more!] all rights reserved.
Powered by FC2ブログ.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。