LAMY safari ローラーボールです。

前回、M16の代わりにBRFN30を使う方法を書きましたが、http://d.hatena.ne.jp/eunote/20071003
今回はM63の代わりにBRFN30を使ってみます。

例によって使用済みリフィルを使い下駄を履かせます。
今回は中でぐらつくようなので、
BRFN30とはセロテープで固定してみました。

先端の出具合を見ながら、下駄の長さを調整していきます。

先端のがたつきはセロテープを適当に巻いて調整します。

ノックがない分、簡単でした。
下駄の加工も先端部の加工も少々失敗しても
テープを巻いたり剥がしたりの調整でなんとかなります。

2000やステュディオのローラーボールでも可能だと思います。


BRFN-30とサファリローラーボールが上記のリンク先で3000円以下くらいです。



ポケットにはノックのサファリ挿して、デスクではキャップのサファリ使ってます。
キャップがあるボールペンも「さあ書くぞ!」と気合が入っていいですね。
また、LAMY2000ボールペンではBRFN-30を使用できないので、LAMY2000ローラーボールを買えばいいかな・・・
万年筆は仕事で使うのはちょっと・・・な人もキャップありのボールペンの気分の良さを味わえるし・・・
LAMY2000、ステュディオ、cp1とローラーボールなら選択肢も広がるし・・・
この改造はやってみる価値ありです。

こどもが心を開く親の話し方、聞き方

http://www.sweetnet.com/parenting2.htm

これって子供だけじゃなく、
部下が心を開く上司の話し方、聞き方、
患者が心を開く医者の話し方、聞き方、
お年寄りが心を開くヘルパーの話し方、聞き方、
にも通用するなと思いました。

聞き方

  1. 子どもが話しかけてきたときは、こどもに向き合って静かに真剣に耳を傾ける。(テレビを見ながらとか、心ここにあらずという状態では聞かない。)
  2. こどもの気持ちを理解し、「そう。」「ふーん」「なるほど」などという相槌を打ちながら聞く。(この時に、こどもに先走ってアドバイスを与えたり、コメントをつけたりしない。)
  3. こどもの気持ちに名前を与えてやる。(「それは、がっかりしたね。」「恥ずかしかっただろうね。」「怒っているんだね。」などなど。会話例:×「おもちゃが壊れちゃった(大泣き)「乱暴に扱うからでしょ!」会話例○「おもちゃが壊れちゃった〜(大泣き)」「大好きなおもちゃが壊れるたんだ。悲しいね。」
  4. こどもの望みを想像の中で答えてあげる。(「パパもマジックが使えて今すぐアイスクリームが出てきたらすばらしいと思うよ。」)

よくない叱り方

  1. 責める (「何度汚い足で家にあがるなって言ったの。どうして、いつもそうなの。お母さんの言うこと全然聞かないんだから。」
  2. 馬鹿にする (「なんて行儀が悪いの。本当に汚いんだから。」「部屋が汚いじゃないか。本当に犬やネコと同じね。」「また忘れたの?馬鹿ねー。」
  3. 脅し (「もう一度やってごらん。お尻をたたくから。」「3つ数えるまでに着替えられなかったら、置いて行くからね。」
  4. 命令 (「今すぐ部屋を片付けなさい。」「今すぐ着替えなさい。早くして!」
  5. 長々と講義する (「人の手から急に本を取るなんて、お行儀悪いでしょ。あなたは、マナーというものが、どんなに大事だかわかってないのね。もし、他人に丁寧に接してほしかったら、まずあなたがそうするべきでしょ。他人があなたに同じことをしたらどう思う?他人にしてほしくないことは、あなた自身がしないの。」
  6. 警告する (「危ない。やけどするよ。」「気をつけて、車にひかれるよ。」「そこに登るんじゃないの。おっこつわよ。」「セーター着なさい。風邪ひくでしょ。」
  7. 犠牲者的発言をする (「この白髪見なさい。苦労ばっかりさせられるから真っ白になっちゃったじゃない。」「自分が親になれば、お父さんが、どんなに大変かわかるよ。」「あなたのせいで、病気なりそう。」
  8. 比較 (「お隣○○ちゃんを見習いなさい。」「リサちゃんは、なんて行儀がいいんでしょう。今までお行儀が悪いところ見たことがない。」
  9. 皮肉 (「明日テストがあるのわかっているのに、教科書本を学校に忘れてきたの?なんて頭がいいんでしょう。」「学校にそんなの着ていくの?きっとみんなに誉めらるよ。」
  10. 予言 (「成績のことで嘘をついたでしょ。そういう子は、大きくなったらどうなると思う?誰も信じない人になるんだよ。」「自分勝手でも結構。誰も、あなたみたいな子とは遊んでくれなくなるよ。友達が一人もいなくなっちゃうからね。」

などなどと紹介されています。
・共感する。
・否定的な言葉でしからない。
・解決方法を考えさせる。
というのが重要なようです。

否定しないというのは、
コップに水をいれて運ばせる時に「こぼさないで」と声をかけると、
子供はこぼすらしいですから・・・

ネガティブなイメージが潜在意識にあると、実際の行動に影響を与えるとの事。

人間の脳はものすごく複雑精緻な動きをしてくれるが、そのOS(オペレーティングシステム)は、驚くほど単純だ。それは、口から出た言葉や単語をそのまま実行しようというOSなのだ。だから、「失敗」とか「悩み」とか、「敗北」とか「病気」などのネガティブ系の単語をたびたび使っていると、そうした現実を引き起こそうと、潜在意識が努力を始めてしまうのだ。それはホルモン分泌という形で努力を開始するのだ。失敗ホルモン、病気ホルモンを分泌する。逆の場合には、成功ホルモン、健康ホルモンを分泌するのだ。

また、注意しなければならないのは、我々のOSは、文法を理解できないということ。例えば、主語を認識しない。「アイツは失敗したらしい」と言った場合、「アイツ」という主語を認識せず、失敗という現象や名詞だけをキャッチしてしまうのだ。また、否定語も認識しない。「失敗したくない」という場合、"したくない"を認識しない。だから"失敗"だけを認識してしまう。

http://www.plinst.jp/musouan/os.html

ケアプランをポジティブに書くとか関係あるのかも

潜在意識を書き換えて、愚痴に対処する魔法

http://wizardpico.blog66.fc2.com/blog-entry-191.html

人をけなしたり、愚痴を言うのは駄目、聞くのも駄目、いい所を褒めると、それが自分に帰ってくるよ、と言う話。

昨日テレビを視ていた時の内容からです。
あるタレントさんが発した言葉がありました。
人間には二通りのタイプがある。
出来る事を探す人間と、出来ない事を探すタイプです。
出来る事を探す人間は、物事に対し前向きに対処します。
我社の経営計画書の中にも「否定言葉を使わない」とあります。
肯定的な人生のほうが、絶対に楽しいと思います。

http://karitakensetu.com/cgi-bin/blog/blog.cgi/permalink/20060928141506

しょうがないとも思うんだけど、病気になったから自分はもう駄目だ、あれもできない、これもできない、ここが悪くなった、あそこが悪くなった、ってそれしか言わなくなる人よくいます。
そういう人には、否定的な言葉使わずに前向きになれるような接し方が重要なんですね。

たとえば、次の2つの言い方を比べてください。
(1)「頑張らないと、私の業績は上がらない」
(2)「頑張れば、私の業績は上がる」

一般的に(1)の言い方だと、業績を上げることが難しい感じがして、モチベーションが下がります。
(2)の言い方だと、業績を上げることができそうな気がしてきて、意欲が湧いてきます。

(1)の言い方「・・・しないと〜〜できない」はダブル否定と言われ、モチベーションを下げる言い方なのです。

自分で(1)の言い方をした時、脳は自分が発した言葉を聞いて何をイメージすると思いますか?
そうです、頑張りきれなくて、業績を上げることができない自分の姿をイメージしてしまうのです。

一方、(2)の言い方だと、脳は、頑張って業績を上げている自分の姿をイメージするのです。
脳はイメージに反応して、自分をイメージどうりに動かすのです。(だからこそ、ビジュアリゼーションが有効!)

上司が部下に対して声をかけるときも、この原理が当てはまります。「本気でやらないと、いい仕事はできないぞ。」というダブル否定の言い方は、部下のモチベーションを下げる方向に働きやすいのです。

http://coaching.livedoor.biz/archives/15817328.html

「立たないで、転びますよ」という声かけは×
でも、「頑張れば歩けるようになります。」とかは、
プラスの目標でもあまり安易に言葉にするのもいけないですね。
「ご飯まで時間があるので、ゆっくり座って休みましょう」とか、
「足が元気になるように運動しましょう」とか
「寝るばかりだと寝たきりになりますよ」ではなく
「天気がいいですよ、外を見てみませんか」とか

絶対に消極的な言葉は使わないこと。否定的な言葉は口から出さないこと。悲観的な言葉なんか、断然もう自分の言葉の中にはないんだと考えるぐらいな厳格さを、持っていなければだめなんですよ。

人間はペシミズム(悲観主義)を刺激して発奮させるよりも、オプチミズム(楽天主義)をくすぐり元気にさせる方がより効果的である。

http://www.naykn.net/success/category/words-008.html

だそうです。

どんな選手でも、否定的な言葉を言われ続けると、モティベーションが下がる。
最初にどんなに「やる気」があったにしても、否定的な言葉が横行するとマイナス思考になる。
仮に失敗しても「次でとり返す」といったポジティブな考え方に仕向けないと、結果は遠のく。

http://www12.plala.or.jp/endou27/hitorigoto7.html

何気ない会話でも、お互い気がつかない所で相手のモチベーションを上げたり下げたり影響を与え合っているのかもと思いました。
気をつけたいです。

例えば、「お仕事の調子はどうですか?」と聞かれて、「いやー、苦戦しております」と答える人は、実際、苦戦の人生を送ります。「私などは、たいしたことはありませんよ。」と答える人は、確実に、たいしたことない結果を作ってしまうのです。「おかげさまで順調です。」といつも答える人は順調な人生を送り、「おかげさまで絶好調です」といつも答える人は絶好調の人生を送ります。(もちろん、TPOに応じて適切な言葉を使い分ける必要があることもありますが)
仕事から帰って「疲れた」と言う人は、その後、脳の活動が鈍ります。脳は自分が発する言葉を聞いて、勝手にイメージし、そのイメージどおり自分を動かすのです。一方、肯定的な言葉を使うと、脳は「ハッピー・ホルモン」とか「やる気ホルモン」といわれるベータ・エンドルフィンを分泌するのです。
また心理学で、「人間は、自分の言葉に洗脳される動物」と言われます。いつも口ぐせのように言っている言葉に、自分自身が洗脳されるのです。
成功者は苦労話をしません。誰かのために過去の失敗を語るときも、決して辛い苦労話としては語りません。経験できてよかったこととして、明るく話します。苦労話が好きな人は、苦労の人生を送ります。

http://coaching.livedoor.biz/archives/15817328.html

なるほど。
人から好かれる人、一緒にいて楽しい人を思い浮かべると、否定的な言葉を使わない気がします。

cgi.rbを使わずにやってみました。
http://apollorec.main.jp/ruby/
ソースコード全部は、上に置いてます。

class Kent
  #-------------------------------------------------
  #  フォームデコード
  #-------------------------------------------------
  def initialize
    buf = ""
    @form = Hash.new
    if ENV['REQUEST_METHOD'] == "POST"
      if ENV['CONTENT_LENGTH'].to_i < 51200
        buf = $stdin.read(ENV['CONTENT_LENGTH'].to_i)
      end
    else
      buf = ENV['QUERY_STRING']
    end
    buf.split(/&/).each {|l|
      (key,val) = l.split(/=/)
      val = "" unless val
      key = key.tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n) do
        [$1.delete('%')].pack('H*')
      end
      val = val.tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n) do
        [$1.delete('%')].pack('H*')
      end
      val.gsub!('&', '&amp;')
      val.gsub!('"', '&quot;')
      val.gsub!('>', '&gt;')
      val.gsub!('<', '&lt;')
      val.gsub!("\r\n",'<br>')
      val.gsub!("\r",'<br>')
      val.gsub!("\n",'<br>')
      if @form[key]
        @form[key] = @form[key] + "\0" + val
      else
        @form[key] = val
      end
    }
  end
  def [](key)
    @form[key].to_s
  end
  #-------------------------------------------------
  #  クッキー発行
  #-------------------------------------------------
  def set_cookie(str, name = 'KENT')
    t = Time.now + 60*24*60*60
    gmt = t.strftime("%a, %d-%b-%Y %H:%M:%S GMT")
    str = str.gsub(/([^ a-zA-Z0-9_.-]+)/n) do
      '%' + $1.unpack('H2' * $1.size).join('%').upcase
    end.tr(' ', '+')
    print "Set-Cookie: #{name}=#{str}; expires=#{gmt}\n";
  end
  #-------------------------------------------------
  #  クッキー取得
  #-------------------------------------------------
  def get_cookie(name = 'KENT')
    str = ENV['HTTP_COOKIE'] || ''
    cook = Hash.new("")
    str.split(/;/).each {|l|
      (key,val) = l.split(/=/)
      key.gsub!(/\s/,'')
      cook[key] = val
    }
    cook[name].tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n) do
      [$1.delete('%')].pack('H*')
    end
  end
  #-------------------------------------------------
  #  ファイルロック
  #-------------------------------------------------
  def lock(lock_dir)
    lock_flag = false
    3.times{
      begin
        Dir.mkdir(lock_dir)
        lock_flag = true
        break
      rescue
        d = File::stat(lock_dir)
        Dir.rmdir(lock_dir) if d.mtime.to_i < Time.now.to_i - 60
        sleep 1
      end
    }
    return lock_flag
  end
  #-------------------------------------------------
  #  アンロック
  #-------------------------------------------------
  def unlock(lock_dir)
    begin
      Dir.rmdir(lock_dir)
      lock_flg = true
    rescue
      lock_flag = false
    end
    return lock_flag
  end
end

cgi.rb使った方がいいんですか。
htmlエスケープも一度にできるし、クッキーも使いやすいので、
これはこれで自分が使う範囲では使いやすいので、
これはこれという事で。。。

ロックも複数ファイルを更新する時とかいるかなと思うんですけど

そして、kentやるならYYbbsをと思ってソース見たら、
更に、ややこしやー、でした。
昔はもっとシンプルだったと思うんだけどなー。

ファイルアップロードをつけようと思い、また悩む・・・
ググってみるとcgi.rbは、いろいろ問題や不満があるようで、
新しいの作るかとか話が出てるようですね。
あとrequireするのに時間がかかるとか・・・
ASKABBSでclassにしたから遅くなったのかと思ってたけど、
cgi.rb使うようにしたことが原因だったのかな?
仕様が変わったり、新しいのが出てきたりするのなら、
あまり依存しない方がいいのかなと思ってます。

taslamさん、ありがとうございます。
面白くなってきたので、とりあえず動くとこまで作りました。
前回、教えてもらった所は、まだ直してないし、
ちょっとおかしいと自分でも思うところもありますが・・・

http://apollorec.main.jp/aska/aska.cgi

http://apollorec.main.jp/aska/aska2.txt
http://apollorec.main.jp/aska/tmp.html
http://apollorec.main.jp/aska/error.html
http://apollorec.main.jp/aska/message.html

ローカルで動いたのにサーバにアップするとエラーが出て悩んだのですが、
hostを取得して、保存用にhtmlエスケープするところでエラーが出ていました。
hostの内容を変更してはいけない(できない?)ためのエラーだったようで・・・
ちょっとググったら
Ruby の代入はオブジェクトへのリファレンスを作るだけ」
この辺が関係ありそうです。
b = a.dup
を使えばいいのか、なるほど。
でも全く意識せず = 使ってたけど
b = a で b を変更したら a も必ず変わりますか?
・・・う〜む

ちょっと本を読んで勉強します。
そして、ちまちま掲示板を修正していきたいと思います。

クラスを強引に使ってみました。
今日は投稿部分。
自分としては前より分かりやすくなった気がします。

class Axs
  attr_accessor :host, :addr
  def initialize(get_host)
    @host = ENV['REMOTE_HOST']
    @addr = ENV['REMOTE_ADDR']
    if get_host == 1 && (@host == "" || @host == @addr)
      require "socket"
      a = Socket.gethostbyname(@addr)
      @host = Socket.gethostbyaddr(a[3], a[2]).first
    end
    @host = @addr if @host == ''
  end
  def ip_check(list)
    list.split(/\s+/).each do |l|
      l = l.gsub(/\./,"\\\.")
      l = l.gsub(/\*/,"\.\*")
      if /^#{l}/i =~ @addr
        return true
        break
      end
    end
  end
  def host_check(list)
    list.split(/\s+/).each do |l|
      l = l.gsub(/\./,"\\\.")
      l = l.gsub(/\*/,"\.\*")
      if /^#{l}/i =~ @host
        return true
        break
      end
    end
  end
  def postCheck
    "POST以外受け付けていません。<br>" if ENV['REQUEST_METHOD'] != "POST"
  end
  def refCheck(url)
    ref = ENV['HTTP_REFERER'].gsub(/\?.*/,'')
    "不正なアクセスです。<br>" unless ref.index(url)
  end
end

class Res
  attr_accessor :name, :email, :sub, :comment, :url, :pwd
  attr_accessor :no, :date, :host, :time
  def initialize
    @no
    @date
    @name
    @email
    @sub
    @comment
    @url
    @host
    @pwd
    @time
  end
  def no_wd(str) #  禁止ワードチェック
    flg = nil
    str.split(/,/).each do |l|
      flg = 1 if @name.index(l)
      flg = 1 if @comment.index(l)
    end
    "禁止ワードが含まれています。<br>" if flg
  end
  def jp_wd #  日本語チェック
    if @comment !~ /[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]/
      "コメントに日本語が含まれていません。<br>"
    end
  end
  def urlnum(num) #  URL個数チェック
    if num > 0 && num < @comment.scan("ttp://").length
      "コメント中のURLアドレスは最大#{num}個までです。<br>"
    end
  end
  def formCheck # フォーム内容をチェック
    err = ''
    err << "名前が入力されていません。<br>"  if @name.empty?
    err << "コメントが入力されていません。<br>"  if @comment.empty?
    err << "Eメールの入力内容が不正です。<br>"  if @email != '' && @email !~ /^[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,6}$/
    return err
  end
  def date_now # 現在時刻を取得
    t = Time.now
    @time = t.to_i
    wk = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']
    @date = sprintf("%04d/%02d/%02d(%s) %02d:%02d:%02d", t.year, t.month, t.day, wk[t.wday], t.hour, t.min, t.sec)
  end
  def encrypt # パスワードをクリプト
    salt = [rand(64),rand(64)].pack("C*").tr("\x00-\x3f","A-Za-z0-9./")
    @pwd = @pwd.crypt(salt)
  end
  def save # ログ保存形式のデータを出力
    surl = @url
    ssub = @sub
    surl = '' if surl == "http://"
    ssub = '無題' if ssub.empty?
    "#{@date}<>#{@name}<>#{@email}<>#{ssub}<>#{@comment}<>#{surl}<>#{@host}<>#{@pwd}<>#{@time}<>\n"
  end
end

class Log
  def initialize(log_file)
    @log_file = log_file
    @no = 1
  end
  def wCheck(res) # 記事番号取得、二重投稿チェック、連続投稿制限
    msg = ''
    f = File.open(@log_file, "r")
    f.flock(File::LOCK_EX) # 占有ロック
    log = f.gets
    f.flock(File::LOCK_UN) # アンロック
    f.close
    no,dat,nam,eml,sub,com,url,hos,pw,tim = log.split(/<>/)

    # 記事No採番
    @no = no.to_i + 1

    msg = "二重投稿です。<br>" if res.name == nam && res.comment == com

    flg = 0
    case $regCtl
      when 1
      flg = 1 if $host == hos && res.time.to_i - tim.to_i < $wait
      when 2
      flg = 1 if res.time.to_i - tim.to_i < $wait
    end
    if flg == 1
      msg << "現在投稿制限中です。もうしばらくたってから投稿をお願いします"
    end

    return msg
  end
  def regist(res,max) # 投稿保存
    f = File.open(@log_file, "r+")
    f.flock(File::LOCK_EX) # 占有ロック
    log = f.readlines

    # 先頭に新しい記事を挿入
    log.unshift("#{@no}<>#{res.save}")
    # 記事数調整
    log = log.slice(0, max) # 先頭からmax件を切り出す log.slice(0..max-1)でも同じ
    # 更新
    f.rewind # 書き出し位置を先頭に
    f.print log
    f.truncate(f.pos) # これ以降のデータ(古いデータ)があれば削除
    f.flush() # バッファをフラッシュ(メモリ上に未書き込みのデータがあれば書き込み)
    f.flock(File::LOCK_UN) # アンロック
    f.close
  end
end
require 'cgi'
cgi = CGI.new

if cgi['mode'] == 'regist'

  axs = Axs.new($gethostbyaddr) # IPとホストを取得
  flg = nil
  unless $deny_addr.empty? # アクセス制限チェック
    flg = axs.ip_check($deny_addr)
  end
  unless $deny_host.empty?
    flg = axs.host_check($deny_host)
  end
  error("アクセスを許可されていません") if flg

  error_msg = ''

  res = Res.new # 投稿されたデータでレスオブジェクト?を作成

  res.name = cgi['name']
  res.email = cgi['email']
  res.sub = cgi['sub']
  res.comment = cgi['comment']
  res.url = cgi['url']
  res.pwd = cgi['pwd']
  res.host = axs.host
  res.date_now
  res.encrypt

  log = Log.new($logfile) # ログオブジェクト?を作成

  error_msg << axs.postCheck.to_s # 投稿エラーをチェック
  error_msg << axs.refCheck($baseUrl).to_s
  error_msg << res.no_wd($no_wd).to_s
  error_msg << res.jp_wd.to_s
  error_msg << res.urlnum($urlnum).to_s
  error_msg << res.formCheck.to_s
  error_msg << log.wCheck(res).to_s

  error(error_msg) unless error_msg.empty? # エラーがある?

  log.regist(res,$max) # エラーが無ければ記事を記録

  msg = "#{cgi['name']}<>#{cgi['email']}<>#{cgi['url']}<>#{cgi['pwd']}"
  cookie = CGI::Cookie.new('ASKA_BBS', msg) # クッキーを記録
  cookie.expires = Time.now + 60*24*60*60
  content = "<a href='./aska.cgi'>書き込み完了</a>"
  cgi.out("cookie" => cookie){content}

  exit
end