宇宙の研究を初める人向けのソフトウェア講習

# はじめに

宇宙を志す人向けのソフトウェアの基礎について、在宅でも出来るように簡単に紹介してみます。対象は、ソフトウェアは授業で少しやりました、くらいの学生さんあたりを想定してます．(2020.4.9. とりあえずの初版, 2024.4.11追記). 

google Colab, tex, overleaf, beamer, 発表スライドの作り方、などは下記を参照ください。

---

- [宇宙の研究を始める人向けの google Colab を用いたオンライン学習](https://qiita.com/yamadasuzaku/items/4e624f5659b4757ad9a3)
- [宇宙の研究を初める人向けの tex + overleaf + beamer の使い方](https://qiita.com/yamadasuzaku/items/65398e8b365adffad1fe)
- [宇宙天文分野で発表資料を作成する時に気をつけて欲しい10個のルール](https://qiita.com/yamadasuzaku/items/075ddc11bb09b40e6af6)

---

# 基礎知識編

## ソフトウェアとは何か？なぜ大事なのか。

ソフトウェアとは端的にはコンピュターの世界の言語で、言語とは、「自分の考えを相手に伝える」「相手の考えを理解する」ために必要なツールともいえます。つまりは、「コミュニケーションツール」なのです。誰と誰を繋ぐものか？というと、その対象がハードウェアとCPUであったり、ハードウェアと人間、であったり、その対象は今では「モノ」と「人」を繋ぐ上でも重要な存在です。それが宇宙の研究?とどう関わるかというと、宇宙の綺麗な画像や、世界で初めて目にするようなデータと「会話」するためのツールとして、ソフトウェアが不可欠になっています。

---

今では、宇宙の研究において、ソフトウェアは一つの"実験装置"や"実験技術"と認識されています。例えば、実際、NASAにはソフトウェアの専門家の部隊が存在しますし、実験装置を開発している研究所にはソフトウェアの専門家がいます。最先端の観測装置と上手に"意思疎通"し、膨大なデータと"対話"するためのツールがソフトウェア言語で、英語と同じくらい重要な"外国語"という認識で、ソフトウェアの「単語」「文法」「作文」の力を若いうちに修行しておくとよいです。

---

## ソフトウェア言語

批判を恐れずに最低限は何か？といえば、今は python でしょう。ただし、言語には英語やフランス語以外にもたくさんあるように、コンピュータの言語にも色々あって良し悪しありますので、何かある言語だけ知っていれば万事OKということはないです。そこで、まずはコンピューター言語の種類を概観してみましょう。

---

###  CUIコマンド

CUIは、Character User Interface (CUI) の略です。windows であれば、コマンドプロンプトでの操作、Mac や linux であればターミナルでの操作に対応します。それぞれ初見という人は下記の記事をまずは一読ください。

- [今さら聞けない！コマンドプロンプトの使い方【初心者向け】](https://techacademy.jp/magazine/5318)
- [今さら聞けない！ターミナルの使い方【初心者向け】](https://techacademy.jp/magazine/5155)
- [Macユーザーなら知っておくべき「OS X」のターミナルコマンド16選](https://japan.zdnet.com/article/35078006/)

---

若い人だと、なぜ低レベルなコマンドを打たないとダメなのか？と思ったかもしれません。ソフトウェアの世界では、低レベルな操作(CUI)は、高レベルな操作(GUI)よりも古くてダメということはないのです。特に、宇宙の観測装置やデータを解析する上では、低レベルから高レベルまで層状になったソフトウェアを巧みに操れることが大切です。操作の自動化や保守運用も簡単で安全にできないといけません。その根底をなすのはコマンドラインでのツールで、これを早めに知っておかないと時間を無駄に費やしてしまいます。

---

そのうち、パターン処理言語の３つをまず知っておきましょう。「awk」「sed」「grep」です。「awk」は、文字列の分割や選択、演算ができます。「sed」は文字の置換です。「grep」は文字の検索ができます。unix のコマンドなので、linuxとmacはデフォルトで所定の動作をしますが、windowsは素直にはいきませんので、無理にコマンドプロンプトでやる必要はないです(windowsにlinuxベースの入れる方が楽かも)。最近はwindowsに、Windows Subsystem for Linux (WSL)があるので、これでlinux環境も簡単に構築できます。[WSL (Windows Subsystem for Linux)の基本メモ](https://qiita.com/rubytomato@github/items/fdfc0a76e848442f374e)を参照ください。３つのコマンドについては、

---

- 一般的な話
    - [UNIX Tool (パターン処理言語 grep, sed, awk)](https://sites.google.com/site/harano2011/unix)
- Mac, linux 向け
    - [【sed / awk / grep】文字列の置換・抽出・検索と正規表現 | Linux Cheat Sheet]( https://qiita.com/shuntaro_tamura/items/e4e942e7186934fae5e7)
- windows 向け
    - gawk [awk入門 コマンドの使い方とスクリプトの書き方](http://itref.fc2web.com/unix/awk.html)
    - findstr [Windows標準コマンドでgrepする](https://tech-mmmm.blogspot.com/2015/02/windowsgrep.html)
    - sed [sedでこういう時はどう書く?](https://qiita.com/hirohiro77/items/7fe2f68781c41777e507)

を一読ください。でも、これだけだとまだ有り難みが分かりませんね。
具体例を出すと、1万天体の銀河カタログの書かれたテキストファイルが(gal.txt)があったとします。そこに、NGCカタログがどのくらいあるかは、「grep NGC gal.txt」で検索できます。"NGC"という文字を"N"と短くしたい場合は、「sed "s/NGC/N/g" gal.txt」で可能です。10行目が以降だけ取得したい場合は、「awk 'NR>10{print $0} gal.txt'」で可能です。このようにデータの前処理を手軽にやるのに便利です。

---

もうひとつ挙げると、rsync というコマンドです。これは、ファイルの同期やコピーをするために使います。時々刻々と増えていくデータをコピーする場合、すでにコピーしたデータをもう一度コピーするのは避けて、変更分だけコピーしたいでしょう。rsyncはそのような差分を計算し、差分だけを圧縮してコピーする優れたコマンドツールで、宇宙の研究で扱う巨大なデータの転送や実験では今でもよく使われています。初めての人は、

- [はじめてrsyncを使う方が知っておきたい6つのルール (1/2)]( https://www.itmedia.co.jp/enterprise/articles/0804/21/news013.html)
- [rsyncの使い方めも](https://qiita.com/smallpalace/items/dd18a1e53830c58c6fe1)

あたりや、初めてサーバーを使います、という方は、

https://qiita.com/yusuke_s_yusuke/items/a031c157d722dc511ec5

などもご一読ください。

---

### 低級なスクリプト言語

CUIのコマンドは便利ですが、それらを組み合わせるともっといろんなことができます。例えば、「１時間に一回ファイルをコピーして、ファイルの中のデータを加工して、別のファイルに書き出す」、という一連の処理をしたい場合があるとしよう。そのような一連の処理の流れのことを[バッチ処理](https://www.imkk.jp/blog/what-is-batch-processing.html)といいます。これを簡単にやってくれるのが、「シェルスクリプト」というものです。web上に山のように説明があるので、初見の人は、

- [シェルスクリプトBash入門](https://qiita.com/ebisennet/items/573618ab827ce1660b0e)
- [シェルスクリプト入門 書き方のまとめ](http://motw.mods.jp/shellscript/tutorial.html)

に目を通してください。これを操れるだけで研究人生が大きく変わるといっても過言ではないと思います。

---

「１時間に一回〇〇の処理をする」を実現するには、cron が簡単です。

- [Cronの使い方とテクニックと詰まったところ](https://qiita.com/UNILORN/items/a1a3f62409cdb4256219)
- [crontabコマンドについてまとめました](https://eng-entrance.com/linux-command-crontab)

を参考にしてください。

---

最近では、python の schedule を使うことも多いです。

- [Python Scheduleライブラリでジョブ実行](https://qiita.com/Kai-Suzuki/items/0c5c0e5cbdb4075fe482)

あたりをご参考に。

---

windowsでも、もちろんバッチ処理は可能で、

- [バッチファイルの作成と実行](https://www.adminweb.jp/command/bat/index1.html)

など、コマンドを列記したものを自動実行する、という観点ではlinuxやmacと同じ機能があります。ただし、宇宙で大規模なデータ処理などはlinuxのシェルがほとんどだとは思います。

---

並列処理をするには、GNU parallel というツールが便利です。

- [コマンドを並列に実行するGNU parallelがとても便利](http://bicycle1885.hatenablog.com/entry/2014/08/10/143612)
- [Get more done at the Linux command line with GNU Parallel](https://opensource.com/article/18/5/gnu-parallel)

テキストファイルにjobsを書いておいて、それを読み込ませるだけです。

``` bash:
%cat jobs.txt # 適当にjobsをテキストに記述する。                                                             
echo 1
echo 2
echo 3 
/bin/ls -1 | tail -2 
date
uname -a 
%parallel --jobs 6 < jobs.txt # 最大6コアで走らせる。
```

コア数よりも、jobsの数が多い場合は、parallelがjobsを管理して適切にやってくれるらしい。
これで並列処理も簡単にできる。

---

### 高級なスクリプト言語

さて、スクリプト言語とはインタプリータ言語(プログラムを 1 行ずつ機械語に翻訳して実行)するものです。"高級"とはここでは[オブジェクト指向](https://ja.wikipedia.org/wiki/オブジェクト指向)を意味することにします。
宇宙天文では、python か　ruby が主流だと思いますが、ここでは python を前提に説明します。

python の具体的な使い方は後述しますので、ここでは一般論だけ紹介します。インタプリータ言語は逐次解釈するので、実行速度は次に紹介するコンパイラ言語に比べると桁で遅いです。ただし、宇宙天文のように、ベクトルや行列演算などの単純な処理をする場合は、その部分だけC言語やfortranで書かれたプログラムを読み出すことができます。numpy という python の数値計算ライブラリの多くは過去のレガシーな高速モジュールを使うことで、python だけど早い処理の実現に成功しています。少し専門的になりますが、これは、[binding](https://esperia.hatenablog.com/entry/2015/11/29/173734) という技術のおかげで、python は C/C++言語とお話できます。

---

python の思想として、誰が書いても同じようになる、というのがあります。これは過去のperlやC言語などは、同じ処理を全く違う書き方ができるような自由な世界でしたが、その一方で、読みにくさやチーム開発の難しさがありました。python はルールが厳しいこともありますが、その分、個人差が抑制されて，誰でも読みやすい言語になっています。

---

例えば，C言語で，sin(x)の差分 sin(i+1)-sin(i) を計算するコードはこのようになります．

``` c:
#include <stdio.h>
#include <math.h>
#define f(x) sin(x)
int main() {
    double x1,x2,dy;
  for (int i=0; i<100; i++) {
    x1 = i;
    x2 = i+1;
    dy = f(x2) - f(x1);
    printf("x, f'(x) = %f %f \n", x1,dy);
  }
}
```

---

これを python で書くと，

``` python:
#!/usr/bin/env python 
import numpy as np
x = np.arange(101)
y = np.sin(x)
dy = y[1:] - y[:-1]
print("x1, dy =", x[:-1], dy)
```

のように for ループなしで書けます．python の方は，カギカッコを使って計算してますね．これは"スライス"と呼ばれるもので，配列の要素に簡単にアクセスできる仕組みのことで，詳細は[【Python】スライス操作についてまとめ](https://qiita.com/tanuk1647/items/276d2be36f5abb8ea52e)を参照ください．

書き方によっては計算速度が変わります。Numpy 配列と互換性のある関数、が使えるのも python のメリットになるので、気になる方は下記を参照ください。

https://qiita.com/yamadasuzaku/items/1c37b2fa38ee4159bb3b

--- 

宇宙天文では、ベクトルや行列の演算が多いのですが、python は C/C++言語よりもシンプルに記述できます。C/C++言語では for ループを多用しますが、python では 「for ループ を使わない」方が python っぽいと言われるくらい、ループしなくても配列の演算やアクセスがしやすいです。最近では、機械学習のためのツールもpythonをベースとしたものが多いです。今から初める若い人はpythonからスタートするので大間違いはないでしょう。

---

### コンパイラ言語

コンパイラ言語は、一度、全体をコンパイルといって、プログラムが最適に動くように機械語に翻訳して、実行ファイルが生成されて、それを動かすタイプものです。C/C++はコンパイラ言語です。とにかくスピードが必要な場所では、今でもC/C++言語を使います。例えば、FPGAとCPUのクライエントとサーバーのプログラムは普通はC++で書かれます。高エネルギー分野の人は [root](https://root.cern.ch)を使いますので、C++も勉強しておきましょう。モンテカルロシミュレーションの代表格である[geant4](https://geant4.web.cern.ch)を使う人もC++は必携になります。

--- 

## ソフトウェアを扱う前の基礎知識

### 環境変数

環境変数とは、OSが設定値を保存し、ユーザーや実行されるプログラムから設定・参照できるようにしたものです。例えば、

- パス（path）を設定する「PATH」
- 現在の利用者のホームディレクトリのパスを表す「HOME」
- 利用者の使う言語（日本語、英語など）を設定する「LANG」
- カレントディレクトリを表す「PWD」
- デフォルトのシェルのパスを指定する「SHELL」

などがあります。

--- 

研究室に入ると、「PATH を通した？」という言葉をよく耳にします。その意味は、

- [「PATH を通す」の意味をできるだけわかりやすく説明する試み](https://qiita.com/sta/items/63e1048025d1830d12fd)
- [Windows 10でPATHを通す設定手順と仕組み](https://itlogs.net/windows-10-path/)
- [MacでPATHを通す](https://qiita.com/nbkn/items/01a11392921119fa0153)

を参照ください。あるプログラムがどこにあるのか、PATHに書かれた順番に探していきます。

--- 

### CPU、GPU、FPGA、組み込みOSとは？

宇宙天文を研究する上で、ソフトウェアとハードウェアは切り離せない。基礎として、ソフトウェアが動く土台を知っておきましょう。

- CPU : [CPU](https://www.pc-master.jp/words/cpu.html)は命令を逐次実行する装置です。命令列さえあればOSがなくても動きます。組み込みのCPUでは、OSを搭載せずに動作確認することが多いです。普段使うパソコンにはOS(windows、mac, linuxなど)が搭載されていますね。OSはソフトウェアの塊であり、ハードウェアとのインターフェースを担うものです。例えば、キーボードを叩く、音楽を聴く、USBでファイルをやりとりする、などの基礎的な機能をOSというソフトウェアが担当しています。

--- 

- GPU : [GPU](https://www.kagoya.jp/howto/rentalserver/gpu1/)は最近流行りの機械学習を支えているものです。これはCPUと違って、定型的な計算を並列処理するのが得意なものです。CPUが数個のコアなのにたいして、GPUの CUDA core というの1万コアなど数が桁違いで、その並列性の高さから機械学習が飛躍的に進みました。ただし、並列化できない計算には向かないです。

--- 

- FPGA : [FPGA](https://www.macnica.co.jp/business/semiconductor/articles/intel/220/) は Field Programmable Gate Array の略で、「書き換え可能な論理回路が多数配列されたもの」 になります。従来はASICと呼ばれる書き換え不可能なモノを使ってましたが、高価な上に書き換え不能なのが難点でした。FPGAは書き換えが可能な上に廉価で手に入るため、最近の宇宙天文の実験装置では不可欠なパートになっています。VHDL、Verilog というソフトウェアで記述しますが、最近ではC言語でも設計可能な高位合成という方法が広まっています。FPGAでCPUを作ることもできます。[microblaze](https://ja.wikipedia.org/wiki/MicroBlaze)というCPUは有名な一つです。

--- 

- 組み込みOS : [組込みOS/システム](https://www.eipc.jp/embedded/arm/)とは（エンベデッドシステムともいいます）、デジタル機器や家電製品などに組み込まれ、特定の機能を実行するコンピュータシステムのことです。宇宙天文の場合は、高度なリアルタイム性や特化した機能が求められる場合に使います。例えば、人工衛星にmacやwindowsを搭載することもできますが、汎用性が高すぎて無駄が多く使われません。最近では、[Xilinx Zynq UltraScale+ MPSoC の宇宙での実用化](https://forums.xilinx.com/t5/Adaptable-Advantage-Blog/Partner-RTEMS-is-being-used-in-NASA-and-ESA-missions-and-now-it/ba-p/1019266) が進められています。

---

このように、宇宙天文で扱うソフトウェアといっても、それが走る舞台がCPUなのか、GPUなのか、あるいはFPGAを記述する言語や、組み込みOSを搭載したCPU向けのソフトウェアなのか、など多岐にわたります。ハードウェアとソフトウェアは別々に設計することもありますが、最近ではハードウェアとソフトウェアの機能をお互いに考慮しながら設計する協調設計（コデザイン、co-design）と言う設計手法が大切になりますので、若い人はぜひ知っておくとよいです。

--- 

### エディタについて

ソフトウェアを書くためのエディタは、紙とペンのようなもので、結構大事です。

- [emacs]( https://qiita.com/bussorenre/items/bbe757ef87e16c3d31ff) これは linux や実験などでは多様される昔の王道エディタです。教養として知っておいた方がよいです。
- [sublimetext](https://www.sublimetext.com) pythonを開発するには書きやすいエディタです。
    - emacsユーザーは、[EmacsユーザーがSublimeTextでpythonのコードを書く時に知っておいた方が良いこと](https://qiita.com/yamadasuzaku/items/77a6af0fe628f71e6b8f) というのも参考に。

他にもたくさんありますが、自分で使いやすいエディタを見つけましょう。

--- 

### doxygen の使い方

ソースコードが読みにくい時などは、doxygenというので、html化して、ブラウザでコードをみると便利です。ソースコードからdoxygenでhtml化ができます。

- https://simple-it-life.com/2016/03/13/doxygen-beginner/
- https://qiita.com/developer-kikikaikai/items/3984606dbdbf2bbbe74e

html化して、iPadなどに入れて、移動中にコードを確認するなど、長いコードをよまないと、という時には便利です。

---

# python の設定と使い方

## pythonのインストール方法

宇宙天文系であれば、[anaconda](https://store.continuum.io/cshop/anaconda/) で python をインストールするのをお勧めします。astropy や matplotlib, ipython などが一式入りますし、ファイルが混在しない設計や、複数の環境の実現(conda activate/deactivateを使う)も簡単にできます。Fermi衛星やChandra衛星のデータ解析ツールは conda の仮想環境を使う設定になってるので、宇宙天文系の人は conda を使うのが便利でしょう。

--- 

2020年3月でpythonの2系が正式に止まったので、python3系を使いましょう。ただし、古いpython2系を使う可能性がある人は、[pyenv](https://qiita.com/mogom625/items/b1b673f530a05ec6b423) で anaconda python を入れる事をお勧めします。[pyenv](https://qiita.com/mogom625/items/b1b673f530a05ec6b423) はディレクトリごとにpythonのバージョンを切り替えられるため、バージョンの異なるモジュールが混在する人にはお勧めします。

--- 

## ブールマスクの使い方 

`python` では、C言語よりも配列の処理が簡単にかけますが、使い慣れるためには、`ブールマスク`という仕組みと、それが `numpy` と python の list という配列での挙動の違いを理解しておく必要があります。詳細は、

https://qiita.com/yamadasuzaku/items/3c5db425ea009256ee75

を参考にしてください。

---

## matplotlib を使ったプロット
ここ数年で、MATLABの python 版が爆発的に使われていて、[matplotlib](https://matplotlib.org) をお勧めします。インストールは、anaconda を入れれば自動で入ります。

例えば、高速フーリエ変換 fft も python で簡単にできます。例えば、

- [matplotlibとscipyのフーリエ変換(FFT)を用いてパーシバルの定理を確認する方法](https://qiita.com/yamadasuzaku/items/946eb042c7302e836c63)

を参照ください。スピードは、fortran のバイナリでFFT部を実行しているのでC++等と比較してもほどんと変わりません。

--- 

今や、実験、観測、宇宙論など、多くの人が matplotlib で図を書いてますので、習得しておくと良いでしょう。

- [早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話](https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9)
- [matplotlibのめっちゃまとめ](https://qiita.com/nkay/items/d1eb91e33b9d6469ef51)

など、日本語の解説記事が山ほどあるのも初めてのひとには優しいです。

--- 

## 宇宙の綺麗な絵を見ながら検索する方法

宇宙は綺麗な絵が一つの魅力でしょう。それを見ながら過去にどういう観測データがあるのかなど、調べられると面白いですよね。現時点では、

- [ESAsky](https://open.esa.int/esasky/) ヨーロッパの宇宙機関(ESA)のツール。
- [DARTS/JUDO2](https://darts.isas.jaxa.jp/astro/judo2/index.html) 日本の宇宙機関(JAXA/ISAS)のツール。

がよくできてると思います。この辺りは急激に技術が進歩しているので、新しく良いものがどんどん出てくると思います。リンクを押すのが面倒な人向けに２つの絵を紹介します。

![qiita_esasky_judo2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179652/c3c8d7c8-5e43-d960-c3c6-52a024308bd0.png)

--- 

これをどう研究に使うのか？という例として、XMM-Newton衛星を使って説明してます。

- [XMM-Newton 衛星のデータ解析について易しい日本語で解説してみた](https://qiita.com/yamadasuzaku/items/0c5f28438f7342b63975) 

天体を探す、データを探す、というのは簡単なようで、観測ごとに個性があって丁寧に見る必要があります。他にもありますが、便利ツールを上手に使いこなしましょう。

--- 

## python を使った宇宙のカタログ研究

今では、[astroquery](https://astroquery.readthedocs.io/en/latest/) を使って、様々な宇宙のカタログについて python から統一的にアクセスすることができます。そのやり方や例をいくつか紹介しています。

- [python の astroquery を用いた宇宙天文カタログの検索と銀河を用いた簡単なプロット方法](https://qiita.com/yamadasuzaku/items/5b83350ae0d2c1e7e278)
- [pythonのastroqueryを用いて検索し、skyviewでfits画像を取得する方法](https://qiita.com/yamadasuzaku/items/df185d151248578e8e1e)
- [pythonでOpenNGCデータベースを用いて銀河の可視光データをプロットする方法](https://qiita.com/yamadasuzaku/items/8856c75ed1e66a3a29cb)
- [pythonを用いて銀経銀緯で複数のfits画像を並べてプロットする方法](https://qiita.com/yamadasuzaku/items/35a95f36144fecd4ad2b)

--- 

# 天体解析関係

## NASA関係のソフトウェア

- [ds9](http://ds9.si.edu/site/Home.html) イメージ解析専用のソフトウェア。波長によらず、イメージ解析では王道のツール。最近はダウンロードするだけで使える。

- NASA の [heasoft](http://heasarc.nasa.gov/lheasoft/) のページから、必要なソフトをダウンロードする。(宇宙天文向け)

hesoftを動作するにはソースコードをダウンロードしてコンパイルする方法と、バイナリで済ませる方法がある。

https://qiita.com/yamadasuzaku/private/3e38a716be280db66bdc

も参考ください。

--- 

バイナリでまずは試して、パスを通すだけで動くはずで、もし動かなければ、ソースコードからコンパイルしてみてください。

"パスを通す"というのは、下記の記述を .bashrc などの設定ファイルに
書き込むことです。例えば、私は２つのマシン環境が手元にあるので、
その２例を示しておきます。

``` bash: 
export HEADAS=/usr/local/astroh/software/HEASOFT/Hitomi_Release_03_rc1/x86_64-debian-linux-gnu-libc2.19-18+
source $HEADAS/headas-init.sh
## For suzaku analysis 
export CALDB=/usr/local/xray/caldb
export CALDBCONFIG=$CALDB/software/tools/caldb.config
export CALDBALIAS=$CALDB/software/tools/alias_config.fits
``` 

要するに、$HEADAS を設定し、headas-init.sh がどこにあるかを設定する。

衛星関係のツールは、CALDB という衛星の設定データが必要なので、
CALDBをダウンロードして、パスを設定します。

--- 

## データ形式

宇宙の研究を始めると、[FITS](https://ja.wikipedia.org/wiki/FITS) (フィッツと読む) が何度も出てくると思うが、これは、天文業界の標準的なファイル形式のこと。

ヘッダー部分の基礎情報は非圧縮のテキストファイルで、データは圧縮されたバイナリファイルで構成される。バイナリファイルについては、[テキストファイルとバイナリファイルとは](https://c.keicode.com/lang/text-vs-binary.php)を参照ください。

--- 

天文以外では、[HDF5](https://qiita.com/skotaro/items/873507dc8f8f967bbc03)がpythonと相性のよいファイルで、使われることも多い。fitsファイルは宇宙天文向けにガチガチに仕様が固められたファイルであり、天文以外で使うことはまずない。fits ファイルを見るには、[fv](https://heasarc.gsfc.nasa.gov/ftools/fv/)という heasoft のコマンドラインツールや、[astropy](https://www.astropy.org) を使う。

--- 

## 統計学

榎戸先生の [榎戸輝揚の公開資料リポジトリ](https://tenoto.github.io/repository/) に色々とあります。その中の一つ、

- [実験データの統計解析]( https://github.com/tenoto/repository/blob/master/docs/statistics_physics_enoto_100506.pdf)

を一読しましょう。

---

フィットやフィッティングについて知らない人は、

https://qiita.com/yamadasuzaku/items/6d42198793651b91a1bc

なども参考ください。

--- 

## 電子的にメモをとる必要性

宇宙天体解析をやる場合、大量にログを取る必要あります。ファイル名の数もそうだし、プログラムを走らせたときの引数やメッセージなどの情報です。これは大切な実験データで、記録を取る必要あります。また自分のためにもなります。あとで自分が何をしたのか、プログラムが動いてたけど実はエラーを吐いてたなど、未来の自分の為になる時が必ずきます。手で記録をとれる情報量ではないので、電子的にログをとりましょう。最近は、evernoteやbearなど、いろんなツールがありますのでお好みに合わせて。(注: 紙の実験ノートが不要、という意味ではないです。)
(追記 2025.6.13, 最近は notion 流行ってますね。)

--- 

# 論文執筆、文献検索、英語学習方法

## 検索方法

研究の世界に入ったら、「英語で検索」する習慣をつけましょう。日本でも十分に情報が手に入る場合はそれでもよいですが、少し専門的になると英語圏の方が情報量が圧倒的に多いので、英語で調べる癖をつけましょう。

--- 

## 論文執筆関係

技術的には、まず早いうちに、texを習得しましょう。tex も一つの言語です。最近は、brew で一発で tex がインストールされるので、これが使える人はこれが一番楽です。

- tex の install (Macユーザー向け)
    - [[Tex] How to install Tex in Mac by Homebrew](https://qiita.com/seaaaaaaaaa/items/861e7488dea10fad64f8)
- windows 向け
   - https://texwiki.texjp.org/?Microsoft%20Windows

--- 

最近は、[overleaf](https://ja.overleaf.com)を使うことも増えている。オンラインで共同で編集する場合はこれが一番よい。

最近では、beamer というので、tex でスライドもノートも作れるようになってます。beamer って何？という人は、

- [Beamerの使い方 : スライドと文章を簡単に行き来する方法](https://qiita.com/yamadasuzaku/items/0fc514cc1b8d056c9485)

を参照ください。

--- 

## 文献検索方法

[ads](https://ui.adsabs.harvard.edu) が王道。ここで検索に引っかからない宇宙の論文はほぼないはず。一つの論文を検索したら、その論文を refer している論文や、citation している論文など、孫引きすることで、芋ずる式に文献が増える。今の時代、一生かかっても読めないほど論文があるので、取捨選択と強弱をつけて論文を読む訓練を若いうちからしておこう。

もう一つ有名なのは、 [arxiv](https://arxiv.org) です。ここには、世界中の論文が最速で集まります。ただし、論文が受理される前に公開されるものもありますので、後々に棄却された論文も含まれる点には注意してください。あとは、受理された論文でも、100%正しいわけではないです。科学は試行と検証の積み重ねが必要で、よいジャーナルの論文でも後で間違とわかることも頻繁にあります。

--- 

今は情報の洪水の時代で、適当な情報は簡単に手に入るけども、本当に欲しい情報や真偽を見極めるのが難しくなってます。逆に言うと、真に必要な情報を素早く収集し、真偽を見極める力がある人が、研究に限らず社会から必要とされる人材でもあります。宇宙物理や天文学の研究をすることは、そのような力を楽しく身につけられる最高の舞台でもあります。

--- 

## 科学英語の勉強

オススメは、 [grammarly](https://app.grammarly.com) です。これは何故ダメなのか、を教えてくれるので、反復する事でエラーが減っていきます。先生から文法間違いを指摘される数はほぼゼロになるはずです。最近はChatGPTのような生成系AIの進展が目覚ましいので、もっと良いものがそのうちたくさん出てくるでしょう。

## 科学論文の書き方

英語の論文の書き方のチェックリストについては、

https://qiita.com/yamadasuzaku/items/99cfa614adf363f3555f

に記事を書きましたので参考にしてください。

--- 

いろんな流派はありますので、初めての人は、牧島先生の資料を参考にしてください。

- [和文の書き方:M2の皆さんへ](http://energetic-universe.phys.s.u-tokyo.ac.jp/wordpress/wp-content/uploads/2018/05/Makishima_JPN.pdf)
- [英文の書き方:科学英文のチェックマニュアル (第6版)](http://energetic-universe.phys.s.u-tokyo.ac.jp/wordpress/wp-content/uploads/2018/05/Makishima_ENG.pdf)

一般的には分野によって、書き方や流派は違うので、論文を投稿するジャーナルに応じて、スタイルは合わせて書きましょう。論文で一番大切なのは、新しい事を１つでよいので、それを核にして伝えることだと思います。"新しい"といっても、世界中の人があっと驚くことでなくても大丈夫です。どんな小さな一歩でも、まだ誰も到達できてない一歩であれば、貴重な科学的な営みです。論文化を意識することで目標がハッキリと見えてきますので、常に論文化を意識して研究する習慣をつけましょう。

--- 

# パソコン操作、設定

## ディスプレイの写し方

手元のPCとプロジェクターの画面を同じにしたい場合は、
ミラーリングをONにする。変えたい場合は、ミラーリングをオフする。
http://tokyo.secret.jp/macs/macbook-mirroring-option.html

パソコンの画面をディスプレイに移すには、アナログとデジタルの２種類がある。最近は、HDMIケーブル(デジタル)が主流です。HDMIケーブルは映像と音声の２種類を伝送できるので、パソコンの音声出力がHDMIになっていると、マイクから「音が出ない」という事がありえるので注意してください。

--- 

## ノートパソコンを壊さないコツ

- トラックパットの深押しでクリックを解除

トラックパッドの深押しでクリックにすると機械的な磨耗が発生する。macユーザーの場合は、システム環境設定==>トラックパッド==>タップでクリック 一本指でクリックにチェックをつける。これでソフトタッチでクリックできるようになる。(もっと気にするなら、外付けキーボード、マウス、トラックパッドを使えば良いが、それならノートPCでなくてもよいか。。)

--- 

- 電源を長期間ONしたままにしない。

電源の寿命の観点からは、こまめに電源をON/OFFするか、少なくするか、どちらがよいかは諸説あります。ただし、明らかに遅いという場合は、メモリ使用量を確認しましょう。死んだアプリがメモリを解放してないだけで、無駄にエネルギーを消費している場合も多いので、個人的には１週間に一回くらいは電源をオフしておいてください。

--- 

## インストールツールについて (macユーザー向け)

macには、fink, macport, homebrew の 3 種類がありますが、今からPCのセットアップという人は、間違いなく、[homebrew](http://brew.sh/index_ja.html) を使うことをオススメします。 他の２つは今ではサポートが不十分というのが理由です。

[homebrew](http://brew.sh/index_ja.html) でなきゃダメなことはないですが、気をつけて欲しいのは、一つだけ使うことです。混在すると、片方を動かしたときに、設定ファイルを書き換えてしまったりすることがあり、ハマることが多いです。

--- 

## パスワードの検索方法 (macユーザー向け)

macユーザーの人はパスワードを覚えなくても、あるいはパスワードを書いたテキストファイルを自分で管理しなくても、OSの機能としてパスワードを管理する keychain というツールがあります。
スポットライト（右上の虫眼鏡マーク）で、keychain と打つ。
http://www.danshihack.com/2014/01/05/junp/mactips_keychain.html
(アプリケーション --> ユーティリティ --> keychain でもよいですが、スポットライトの方が早い。)

--- 

## スクリーンショット (macユーザー向け)

- 「コマンド + shift + 4」を全部同時に押す。https://support.apple.com/ja-jp/HT201361

- 「コマンド + shift + 5」で選択画面に従う

macOSのバージョンに依存しますので、[オフィシャルな説明](https://support.apple.com/ja-jp/guide/mac-help/mh26782/mac)で自分のOSの解説を参照してください。

--- 

## 上級者向けのツール

- [xraylib](https://github.com/tschoonj/xraylib/wiki) X線の光電吸収の断面積や、蛍光X線発生率(fluorescence yield)なども簡単にだせる優れもの。
- [uproot](https://uproot.readthedocs.io/en/latest/) root を python から簡単に使える便利なツール。

--- 

## ショートカットの設定

いくつか，代表的なショートカットは使えるように練習しておこう．

- 「コマンド + q」: アプリケーションの終了
- 「コマンド + tab」: アプリケーションを切り替え
- [Mac 同一アプリケーションでウィンドウを切り替えるショートカット](https://dev.classmethod.jp/articles/mac-next-window-shortcut/) 

--- 

## zsh の 使い方(おまけ) 

zshの何がよい点であるか、簡単に紹介する。bash, tcsh に比べて新しいので、良いことは多い。そもそも「シェルって何？」と言う人は、[shell](https://wa3.i-3-i.info/word11219.html) を一読ください。

- ファイルの検索が一瞬

例えば、どこに保存したか思い出せないけど、拡張子は cc というファイルを探す場合は、

``` bash:
> ls **/*cc　とすると、
```

カレントディレクトリ以下の *cc ファイルを探してくれます。

--- 

- コマンドごとの履歴検索が可能、オプションがすぐに思い出せる。

たとえば、rsync の後にどんなオプションをつけたか思い出せないとき、

``` bash:
> rsync
```

まで打って、ctl + p とすると、rsync + ○○ と打ったヒストリを教えてくれます。

その他、http://blog.blueblack.net/item_204 などを参照してください。

--- 

簡単に初期設定をしたい人は、.zshrc の中に、

``` zsh:
HISTFILE=$HOME/.zsh-history # used for storing commands
HISTSIZE=100000
SAVEHIST=100000
setopt extended_history # add time stump for the history
function history-all { history -E 1 } # output all history when putting history-all

autoload -U compinit
compinit

autoload colors
colors
PROMPT="%{${fg[cyan]}%}[%n] %(!.#.$) %{${reset_color}%}"
#PROMPT="%{${fg[cyan]}%}[%n@%m] %(!.#.$) %{${reset_color}%}"
PROMPT2="%{${fg[cyan]}%}%_> %{${reset_color}%}"
SPROMPT="%{${fg[red]}%}correct: %R -> %r [nyae]? %{${reset_color}%}"
RPROMPT="%{${fg[cyan]}%}[%~]%{${reset_color}%}"

#setopt list_types
setopt auto_list
setopt autopushd
setopt pushd_ignore_dups
setopt auto_menu

# get history with ctl+p copied from Yuasa
autoload history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^P" history-beginning-search-backward-end
bindkey "^N" history-beginning-search-forward-end
setopt list_packed
zstyle ':completion:*:default' menu select=1
```
と入れると、いろんな機能が使えます。

--- 

## タイピングの重要性

タイピングはけっこう大事です。大きくなって腰痛肩こりでしょっちゅうマッサージに行く人もいます。とにかく若いうちに、治すよりも無くす、方法を考えるのをおすすめです。

http://iberia.music.coocan.jp/column_typing.htm

https://pc.watch.impress.co.jp/docs/topic/feature/1190933.html

https://ikezawa-s.com/care/katakoribousi/

https://www.youtube.com/watch?v=Z2xfnLbCeHI

など、web上に様々な情報があるので確認ください。右手と左手のバランス、体のバランス、(じゃっかん好みもありますが)emacs風のショートカット、など、若いうちに習得することをお勧めします。

---- 

# おまけ

## 歴史から学ぶことの大切さ

宇宙研究やソフトウェア開発の現場では、最先端の技術を追いかけるだけでなく、「なぜ今これが主流になっているのか？」という歴史的背景を理解することも大切です。

### 例1：表計算ソフトはマイクロソフトが発明したわけではない

多くの人が、表計算ソフトといえば「Excel」を思い浮かべますが、実はその原型は1979年に登場した「VisiCalc」というApple II用ソフトでした。当時、会計や財務処理を一変させる革新的なツールとして注目され、Appleの販売を後押しした立役者です。

しかし、市場の流れは必ずしも先行者に有利とは限りません。その後、IBM PCに対応したロータス1-2-3が台頭し、さらにWindows時代にはExcelが主流になります。「技術的に優れている＝普及する」とは限りません。

### 例2：NECのVシリーズ vs. IBMのx86系CPU

1980年代、日本のNECは高性能な「Vシリーズ」プロセッサを開発していました。技術的には非常に優れ、国内では広く使われていましたが、世界の主流はIBM互換機（x86アーキテクチャ)へと流れます。結果として、グローバルなソフトウェアや周辺機器との互換性においてNEC機は不利になります。「技術的な優位性があっても、システムや標準化の流れも重要」という教訓だと思います。

### 例3：OSの選択と宇宙観測ソフトウェア

宇宙観測の世界でも、商用OSから非商用OSなど、時代背景に応じたOS選択の歴史がありました。宇宙の研究では、いまだに古いIRAFやFTOOLSなど、特定の環境でしか動かないツールを使っているケースもあります。これを無批判に継承すると、将来の再現性や保守性に問題が出る可能性がありますし、中途半端に改革することで継続性を失う可能性もあります。近年は、PythonやDockerのような長期にわたる持続可能性を意識した設計も進んでいます。

### 歴史を学ぶことは未来の選択に不可欠

目の前の「便利さ」「速さ」「新しさ」だけで選択せず、なぜそれが今、使われているのか？を考えてみるのも大事です。その背景には先人たちの選択、失敗、淘汰の歴史があります。

# まとめ

技術や知識も大事ですが、研究でもソフトウェア選択でも、目先のスペックや流行に飛びつく前に、「これまでどんな選択がなされてきたか？」をよく振り返ることで、自分の選択に自信が持てるようになると思います。

最後、コンピュータを使う上でも身体的要素は重要です。健康や体力は基本なので、自分がストレスなく作業できて、リラックスできる良い環境を自分で見つけてみてください。少しでも何かの参考になれば幸いです。