SSL通信ができなくなった

OpenSSLのアップデートをかけたら、

SSL通信が出来なくなっていた。

 

エラーを調べてみたら、以下の対応で出来た。

http://www.perlmonks.org/?node_id=983524

 

our %ssl_options = (SSL_version => 'SSLv3');
...
$ua = LWP::UserAgent->new(ssl_opts => \%ssl_options);

理由はまだ不明です。
判明したら更新します。

文字化けした文字を調査

文字化けの原因を調査した。(ほぼ一日かかった。。。)

特定の文字っぽかったので、文字のバイトコードを確認した。

UTF-8で「能」という文字の一文字前。

if( $string = q/(.)\x{80FD}/ ) {
    print unpack("H*", $1);
}



調べたら、「c28a」が取りだせた。
その情報から下記の文字という事が分かった。
http://www.fileformat.info/info/unicode/char/8a/index.htm

でも、普通に入力できる。
実体参照にすると(Š)空白になって文字化けする。

以下環境
Perl v5.8.8
PostgreSQL 8.1.23
文字コードUTF-8

今回の文字をCSVでダウンロードしようとすると(CP938)「?」になってしまう。

UTF-8で文字をデコードして、CP932に変換した時に「?」になってしまうので、
その前に取り除くか、他の文字に置換してあげると良さそう。


ただ一つ、なんでそんな文字を入力したのかが気になる。すごく気になる。


参考にしたページ
http://it-scrap.blogspot.jp/2009/12/perl.html
http://www.fileformat.info/info/unicode/char/search.htm
http://www.seiai.ed.jp/sys/text/java/utf8table.html
http://ash.jp/code/unitbl21.htm

TwitterのRSSを取得する

TwitterRSSを取得する方法

http://www.lifehacker.jp/2013/08/130804twitter_rss.html

少し回りくどいけれど、この通りにやれば取得できる。

 

TwitterRSSが普通に取得できなくなったのはとても不便だけれど、

こうやって誰でも取得できる方法を公開してくれる事で、不便が少なくなっていく事は素晴らしい。

複数のselect要素を連動させる

http://www.skuare.net/test/jdependent.html

これを使ったら行けそうだったけど、

表示が undefind になって困った。

 

jQuery1.3.2 以降あたりからtextの取得が出来ないみたいなので下記のサイトを参考に修正した。

http://d.hatena.ne.jp/naaaaari/20120610/1339325733

階層の問題

以下の様な文字列を

foo:表示
 aa:表示
 bb:表示
 cc:表示
  dd:表示
  ee:表示
 ff:表示
bar:表示
 ff:表示
 gg:表示

↓のように変換したい問題

[
 { 'value' => 'foo',
  'data' => [
   { 'value' => 'aa', 'is_show' => 't' },
   { 'value' => 'bb', 'is_show' => 't' },
   { 'value' => 'cc',
     'data' => [
      { 'value' => 'dd', 'is_show' => 't' },
      { 'value' => 'ee', 'is_show' => 't' },
     ],
     'is_show' => 't'
   },
  ],
  'is_show' => 't',
 },
 { 'value' => 'bar',
  'data' => [
   { 'value' => 'ff', 'is_show' => 't' },
   { 'value' => 'gg', 'is_show' => 't' },
  ],
  'is_show' => 't',
 },
]

以下のようにしてみました。

#!/usr/bin/perl -w

use strict;

my $text = qq|foo:非表示
 aa:表示
 bb:非表示
 cc:表示
  dd:表示
  ee:非表示
 ff:表示
bar:表示
 ff:表示
 gg:非表示
hoge:表示
moge:表示|;

my $text2 = qq|aaa:表示
bbb:非表示
ccc:表示
ddd:表示
eee:表示|;


my @texts = split(/(?:\r\n|\r|\n)/, $text2);

# ここに入れていく
my $array = ;
# 階層
my $level_count = 0;
for(my $i=0; $i < scalar @texts; $i++) {
 # 階層が下がった
 if($level_count < ($texts[$i] =~ tr/ //)) {
  # 進んだ回数、親、配列、階層を渡す
  my $parent = $texts[$i-1];
  $level_count++; # 階層が一つ下がった
  my $child_array;
  my $is_last;
  ($i, $child_array, $level_count, $is_last) = &_array($i, $parent, \@texts, $level_count);
#  $level_count--; # 戻ってきたら一つ階層が上がる
  my $hash = {}; # 親子のペア
  my( $value, $is_show ) = ($parent =~ m/[\s+]?([^\s].+):(非表示|表示)/);
  $hash->{value} = $value;
  $hash->{is_show} = ($is_show =~ m/^表示$/ ? 't' : 'f');
  $hash->{data} = $child_array;
  # 1階層目のデータ
  push(@$array, $hash);
  # 進めた分進める
  $i = $i - 1;
  # 最後だったら終わり
  if( $is_last ) {
   last;
  }
 } else {
  # 次のデータが一つ下がるなら無視(親子の関係を作るため)
  next if($texts[$i+1] && ($texts[$i] =~ tr/ //) < ($texts[$i+1] =~ tr/ //));
  # 1階層目のデータ
  my( $value, $is_show ) = ($texts[$i] =~ m/[\s+]?([^\s].+):(非表示|表示)/);
  push(@$array, {'value' => $value, 'is_show' => ($is_show =~ m/^表示$/ ? 't' : 'f')});
 }
}

use Data::Dumper;
die Dumper $array;

sub _array {
 my $num = shift;
 my $parent = shift;
 my $texts = shift;
 my $level_count = shift;

 # ここに入れていく
 my $array = ;
 # 進めた回数
 for(my $i=$num; $i < scalar @$texts; $i++) {
  ## 階層の比較
  # 階層が一つ下がった
  if($level_count < ($texts->[$i] =~ tr/ //)) {
   my $parent = $texts->[$i-1];
   $level_count++; # 階層が一つ下がる
   my $child_array;
   my $is_last;
   ($num, $child_array, $level_count, $is_last) = &_array($i, $parent, $texts, $level_count);
#   $level_count--; # 戻ってきたら一つ階層が上がる
   my $hash = {}; # 親子のペア
   my( $value, $is_show ) = ($parent =~ m/[\s+]?([^\s].+):(非表示|表示)/);
   $hash->{value} = $value;
   $hash->{is_show} = ($is_show =~ m/^表示$/ ? 't' : 'f');
   $hash->{data} = $child_array;
   # 同じ階層のデータ
   push(@$array, $hash);
   # 進めた分進める
   $i = $num - 1;
   # 最後だったら返す
   if( $is_last ) {
    return ($#$texts, $array, $level_count, 1);
   }

  # 階層が一つ上がった
  } elsif($level_count > ($texts->[$i] =~ tr/ //)) {
   $level_count--; # 階層が一つ上がる
   return ($i, $array, $level_count);

  # 同じ階層だった
  } elsif($level_count == ($texts->[$i] =~ tr/ //)) {
   # 次のデータが一つ下がるのなら無視(親子の関係を作るため)
   next if($texts->[$i+1] && ($texts->[$i] =~ tr/ //) < ($texts->[$i+1] =~ tr/ //));
   # 次のデータも同じ階層か階層が一つ上がる場合は同じ階層のデータとして入れる
   my( $value, $is_show ) = ($texts->[$i] =~ m/[\s+]?([^\s].+):(非表示|表示)/);
   push(@$array, {'value' => $value, 'is_show' => ($is_show =~ m/^表示$/ ? 't' : 'f')});
  }
 }

 ## 最後まで行ってしまったら、そのまま帰す
 return ($#$texts, $array, $level_count, 1);
}

どなたか添削してください。

この後、逆変換もやります。