SFTPで接続できなかった件の解決

ずっと放置していたけど,以前の記事
ファイル転送方式についてのメモ - yuo1989の日記
を書いたきっかけの「SCPでは接続できないがSFTPでは接続できる」問題が解決したのでせっかくだし書いておく.

WindowsではWinSCPを使えばSCP接続ができたので問題なかったが,最近iMacを購入してサーバーに接続しようとしたところドツボにはまった.
FileZilla (http://sourceforge.jp/projects/filezilla/)やCyberduck (https://cyberduck.io/index.ja.html)ではSCP接続ができなかった.
後者は以前のバージョンではSCP接続できていたようだが,半年以上前に「SFTPよりいいとこないから消した」とのこと.

あれこれ探していると,とある記事を発見した.
lealog.hateblo.jp
この記事に従って,.bashrcの先頭に
[ -z "$PS1" ] && return
を追記したところ,無事解決したという話でした.
(確かにSFTP接続できなくなった時期に.bashrcをいじった記憶もあります.)

なおログインシェルがbashじゃない場合はどうなるかは試していないので不明です.
(使うのはzshですが,サーバー側の権限がなく,お願いするのも面倒でログインシェルはbashのままなので)

Fortranにおける数の精度について

題名の通り,Fortranでの数の精度について調べてみた.
自分では実数の時はただdouble precisionとしていた.一方で複素数のときにはcomplex(kind(0d0))としていたが,統一的な書式で書きたいと思ったためだ.
reald(8)とcomplex(8)でもよかったのだが,括弧の意味がコンパイラで変わるということも見かける(参考ページ1)ので,kindの意味について調べることにした.

使うのはselected_real_kindというコマンドで,第1引数に桁数,第2引数に指数範囲を代入する.別のページで第3引数も見た気がするが,この2つ,もっと言えば第1引数の桁数のみで十分だと思う.

サンプルプログラムは参考ページ3のそれをいじった次のようなもの.ただひたすらに様々なパターンを突っ込んで実行するのみ.

program real_kinds
  real             :: x0
  real(8)          :: x1
  double precision :: x2
  real(kind(0d0))  :: x3

  integer, parameter :: p6     = selected_real_kind(6)
  integer, parameter :: p6r50  = selected_real_kind(6,50)
  integer, parameter :: p12    = selected_real_kind(10)
  integer, parameter :: r400   = selected_real_kind(r=400)
  integer, parameter :: p33    = selected_real_kind(33)
  
  real(kind=p6)     :: x4
  real(kind=p6r50)  :: x5
  real(kind=p10r50) :: x6
  real(kind=r400)   :: x7
  
  print *, precision(x0), range(x0)
  print *, precision(x1), range(x1)
  print *, precision(x2), range(x2)
  print *, precision(x3), range(x3)
  print *, precision(x4), range(x4)
  print *, precision(x5), range(x5)
  print *, precision(x6), range(x6)
  print *, precision(x7), range(x7)
  print *, precision(x8), range(x8)

end program real_kinds

そして実行結果は

           6          37
          15         307
          15         307
          15         307
           6          37
          15         307
          15         307
          33        4931
          33        4931

という感じ.スペースがあるのはそのまま貼り付けたため.

参考ページに書いてあることと,上の実行結果から分かることとしては,

  • 桁数だけを入力すればその桁数を満たすなかで最低限の精度が返ってくる.
    • 指数範囲だけを入力しても同様.
    • 両方指定した場合は両方を満たす最低限の精度が返ってくる.
  • realとすると,桁数は6で指数範囲は37.
  • real(8), double precision, real(kind=0d0)では桁数15で指数範囲307.
  • これらの精度を越えようとすると,桁数は33で指数範囲は4931になる.これ以上はない(エラーが返ってくる)
  • 複素数については同じものがそのまま使える模様(実数2つの配列のようなものだから当然かもしれないが)

まとめとしては,

  • 特に気にせずdouble precisionやreal(8)を使っている場合は,有効桁数は15になる.
  • もしこれを越えたければ,selected_real_kind(33)など,コンパイラに応じた最大桁数にすればよい.

といったところだろうか.

参考ページ

  1. Fortran入門: 定数と変数
  2. Fortran入門: Fortran Tip集
  3. selected_real_kind in Fortran Wiki
  4. 索引 : SELECTED_REAL_KIND

ファイル転送方式についてのメモ

今まで接続していた方式(SFTP)では突如接続できなくなり,代わりにSCPにしたら接続できるということがあった.
原因は不明だが,ちょうど接続方式について簡単に調べたのでここに書いておく.

まず,Windowsで利用されるファイル転送ソフトには,最も有名であろうFFFTPの他に,FileZillaWinSCPがある.*1 これらはそれぞれ以下の転送方式をサポートしている.

下に行くほどカバーしている通信方式が増えている.
それぞれの通信方式について簡単にまとめておく.

  • FTP(File Transfer Protocol): 最も単純な通信方式で,特に通信内容を暗号化していないので安全性は低い.
  • SFTP(SSH File Transfer Protocol): SSH接続の上でFTPをすることで,通信を暗号化してセキュリティを強化したもの.
  • FTPS(File Transfer Protocol over SSL/TLS): 通信を暗号化すること自体はSFTPと同じ.ただしこちらはFTPの通信内容をSSL/TCPで暗号化する.
  • SCP(Secure Copy): SFTPと同様に,SSH接続の上で通信をおこなうもの.ただし実際に使う上では,通信を途中で中断・再開できるかどうかなどの差があるらしい.

SCPは送受信両方側で対応している必要があるが,SFTPはそうでないということ.なぜ今回SFTPで接続できずSCPで接続できたか定かではないが,とりあえず参考になったのでよしとしよう.

参考ページ

*1:ちなみに,私は最初はFFFTPを利用していたが,開発が停止(現在は有志による開発が続いている)したのを機にFileZillaへ移行,その後2段階接続(トンネリング)ができないのでWinSCPへ移行した.

ブログ始めました

日々の出来事のメモのためにブログを始めることにした.
とりあえず数式が使えるらしいのでそのチェックをしておく.

{\displaystyle \mathcal{K} = \int_V \boldsymbol A \cdot \boldsymbol B \, \mathrm{d}^3 x}

意外と綺麗に表示されて驚いた.
表示に時間はかかるけど,カリグラフィやボールドイタリックもできるので便利.