tsurutanのつぶやき

備忘録としてつぶやきます

AndroidでJava8を使う(Jackツールチェーン)

Jackツールチェーン

今回はAndroidでJava8を使う方法を紹介したいと思います。 以前までretrolambdaというライブラリーが主流でしたが、Android StudioがアップデートしJackツールチェーンというAndroid StudioでJava8が有効にできる素晴らしいツールが使えるようになり至るところの会社がjackツールチェーンに移行し始めている頃です(多分)。 Jackツールチェーンで扱えるJava8の機能は下記のようになります。

さらにさらに下記のJava8機能のAPIも使えるようになりました。

リフレクションおよび言語関連の API

  • java.lang.FunctionalInterface
  • java.lang.annotation.Repeatable
  • java.lang.reflect.Method.isDefault()
  • 以下のような反復アノテーション関連のリフレクション API AnnotatedElement.getAnnotationsByType(Class)

ユーティリティ API

  • java.util.function

ただし前のAndroidバージョンでテストをする際は、必ず build.gradle ファイルの compileSdkVersion と targetSdkVersion の値を 23 以下に設定しないといけません。

ちなみにラムダ式を使うと

findViewById(R.id.button).setOnClickListener(new View.setOnClickListener() {
  @Override
  public void onClick(View view) {
    // event
  }
});

これが。。。

findViewById(R.id.button).setOnClickListener(view -> {
  // event
});

こうなります!!最高ですね。

Gradle設定

Jackツールチェーンを有効にするにはapp直下の build.gradle を下記のように書き直します。

android {
  ...
  defaultConfig {
    ...
    jackOptions {
      enabled true
    }
  }
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

以上です!

既知の問題

残念ながらJackチェーンツールにも問題点があります。 Android Studio 2.0(ベータ版)で導入された Instant Run は、現段階では Jack と併用できません。そのため新しいツールチェーンの使用中は、Instant Run が無効になります。

Jack はアプリのコンパイル中に中間クラスファイルを生成しないため、中間ファイルに依存する以下のようなツールは現在 Jack と併用できません。

  • クラスファイルに作用する Lint Detector
  • アプリのクラスファイルを必要とするツールやライブラリ(JaCoCo や Mockito など)

Effective Android

Effective Android

  • 作者: TechBooster,小太刀御禄,出村成和,重田大助,西岡靖代,宮川大輔,柏本和俊,あんざいゆき,八木俊広,木村尭海,小林慎治,有山圭二,中西良明,わかめまさひろ,新井祐一,桝井草介,久郷達也,寺園聖文,shige0501,山下智樹,前田章博,秋葉ちひろ,末広尚義,中澤慧,日高正博,塚田翔也,井形圭介,中川幸哉,山崎誠,山下武志,なまそで,橋爪香織,さとうかずのり,l_b__,ゼロハチネット,長汐祐哉
  • 出版社/メーカー: インプレスジャパン
  • 発売日: 2014/01/17
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (8件) を見る

Reactive Messaging Patterns with the Actor Model: Applications and Integration in Scala and Akka

Reactive Messaging Patterns with the Actor Model: Applications and Integration in Scala and Akka

Learning Reactive Programming with Java 8

Learning Reactive Programming with Java 8

Minimum Edit Distance - 文字間の距離を計測するアルゴリズム

Minimum Edit Distance

今回は文字間の距離を計算するMinimum Edit Distanceについて説明したいと思います。普通に暮らしていたらMinimum Edit Distanceは使わないでしょうね笑それでも説明します。

まずは具体的な例としてintentionとexecutionという文字間の距離を測りたいとします。

intentionという文字列を文字一つ一つ順に見ていき文字の削除、挿入、転換を繰り返してexecutionに変換すると下図のようになるとおもいます。

f:id:tsurutan:20160518224058p:plain

dはdeletesはsubstitution,iはinsertionの略です。 delete, insertionを使ったとき文字間は1離れ、substitutionを使った場合文字間は2離れているとします。(ただし,substitutionで転換する文字が同じ場合は0)

f:id:tsurutan:20160518223443p:plain

この場合dssisとなっているので距離は8となります。

このような流れをひとつひとつ考えていくととても大変ですのでこれをアルゴリズム化してコンピューター上で計算できるようにしましょう。

アルゴリズム化するため下記のように定義します。ただしsourceは縦軸、targetは横軸,#は空文字としています。またtarget i-1, source i -1などのように1引かれているのは先頭に#がついているため、その長さ分調整するために1引かれています。

f:id:tsurutan:20160518230404p:plain

文字 意味
distance 距離の配列
ins-cost 挿入時の距離
sub-cost 転換時の距離
del-cost 削除時の距離
source 変換される文字配列
target 変換後の文字配列

この式を適用し先ほどのintentionとexecutionをテーブルを使い計算すると下記のようになります。

f:id:tsurutan:20160518230745p:plain

さて後はこのアルゴリズムをコードに直すだけです。 コードのフローは下記のようになります。

f:id:tsurutan:20160518230440p:plain

こちらをPythonで書いてみると

# coding: UTF-8

INS_COST = 1
DEL_COST = 1
target = raw_input("input target ")
source = raw_input("input source ")

# increase length for '#'
target_len = len(target) + 1
source_len = len(source) + 1
distance = [[0 for i in range(target_len)] for j in range(source_len)]
distance[0][0] = 0


def calc():
    for i in range(1, source_len):
        distance[i][0] = distance[i - 1][0] + INS_COST

    for i in range(1, target_len):
        distance[0][i] = distance[0][i - 1] + INS_COST

    for i in range(1, source_len):
        for j in range(1, target_len):
            distance[i][j] = min(distance[i - 1][j] + INS_COST,
                                 distance[i - 1][j - 1] + sub_cost(target[j - 1], source[i - 1]),
                                 distance[i][j - 1] + DEL_COST)
    print_table()


def sub_cost(target_char, source_char):
    if target_char == source_char:
        return 0
    else:
        return 2

def print_table():
    for i in range(source_len, 0, -1):
        print distance[i - 1]

以上です。

入門 自然言語処理

入門 自然言語処理

自然言語処理の基本と技術 (仕組みが見えるゼロからわかる)

自然言語処理の基本と技術 (仕組みが見えるゼロからわかる)

ButterKnifeを使ってコードを綺麗にしよう

ButterKnifeとは

Android界で神と崇められているJake Warton氏が作成したView Injectionライブラリー。 普段AndroidではViewをbindするときに

TextView text = (TextView) findById(R.id.text_view);

としていたがButterKnifeを使えばこのようなコードを書かずにアノテーションで処理ができてしまう素晴らしいライブラリーなのだ。

使い方

メンバー変数を書くところにアノテーション@BindViewを、その横にviewのidを書くことでviewに紐付けることができる。そしてそのあとにViewの型と変数名を書けば出来上がり。 なんて簡単なんだ!! ただし気をつけて欲しいのはActivityでButterKnifeを使うときはButterKnife.bind(this)でActivityを指定しなければならない。

Before

class ExampleActivity extends Activity {
  private TextView title;
  private TextView subtitle;
  private TextView footer;

  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    title = (TextView) findById(R.id.title);
    subtitle = (TextView) findById(R.id.subtitle);
    footer = (TextView) findById(R.id.footer);
  }
}

After

class ExampleActivity extends Activity {
  @BindView(R.id.title) TextView title;
  @BindView(R.id.subtitle) TextView subtitle;
  @BindView(R.id.footer) TextView footer;

  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    ButterKnife.bind(this);
  }
}

またButterKnifeの凄いところはViewだけではなくcolorやstringなどのリソースもBindできるのだ! Viewと同じように@BindStringなどのアノテーションを書き、Idを指定すればはい出来上がり!

class ExampleActivity extends Activity {
  @BindString(R.string.title) String title;
  @BindDrawable(R.drawable.graphic) Drawable graphic;
  @BindColor(R.color.red) int red; // int or ColorStateList field
  @BindDimen(R.dimen.spacer) Float spacer; // int (for pixel size) or float (for exact value) field
  // ...
}

またAcitivty以外のクラスでButterKnifeを使いたい場合はButterKnife.bind(this, view)のようにする必要がある。

public class FancyFragment extends Fragment {
  @BindView(R.id.button1) Button button1;
  @BindView(R.id.button2) Button button2;

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fancy_fragment, container, false);
    ButterKnife.bind(this, view);
    // TODO Use fields...
    return view;
  }
}

AdapterのViewHolderでViewをBindするには下記のようにすれば良い。

public class MyAdapter extends BaseAdapter {
  @Override public View getView(int position, View view, ViewGroup parent) {
    ViewHolder holder;
    if (view != null) {
      holder = (ViewHolder) view.getTag();
    } else {
      view = inflater.inflate(R.layout.whatever, parent, false);
      holder = new ViewHolder(view);
      view.setTag(holder);
    }

    holder.name.setText("John Doe");
    // etc...

    return view;
  }

  static class ViewHolder {
    @BindView(R.id.title) TextView name;
    @BindView(R.id.job_title) TextView jobTitle;

    public ViewHolder(View view) {
      ButterKnife.bind(this, view);
    }
  }
}

さらにButterKnifeを使えばclickイベントもアノテーションを使い処理することができる!

@OnClick(R.id.submit)
public void submit(View view) {
  // TODO submit data to server...
}
All arguments to the listener method are optional.

@OnClick(R.id.submit)
public void submit() {
  // TODO submit data to server...
}
Define a specific type and it will automatically be cast.

@OnClick(R.id.submit)
public void sayHi(Button button) {
  button.setText("Hello!");
}
Specify multiple IDs in a single binding for common event handling.

@OnClick({ R.id.door1, R.id.door2, R.id.door3 })
public void pickDoor(DoorView door) {
  if (door.hasPrizeBehind()) {
    Toast.makeText(this, "You win!", LENGTH_SHORT).show();
  } else {
    Toast.makeText(this, "Try again", LENGTH_SHORT).show();
  }
}
Custom views can bind to their own listeners by not specifying an ID.

public class FancyButton extends Button {
  @OnClick
  public void onClick() {
    // TODO do something!
  }
}

などなどButterKnifeには使える機能がいっぱい!!

どうやったら使えるの?

Android Studioを使っている方はapp直下にあるgradleファイルに

compile 'com.jakewharton:butterknife:8.0.1'

と書くだけです。とても簡単ですね!

合わせて読みたい記事

www.tsurutan.com

www.tsurutan.com

www.tsurutan.com

超初心者でも大丈夫! はじめてのAndroidプログラミング Android Studio 2対応

超初心者でも大丈夫! はじめてのAndroidプログラミング Android Studio 2対応

Rubyでスクレイピングをしてみよう!

Rubyでスクレイピングをしてみよう!

Scrapingでできること

・店舗一覧、商品一覧を抽出する ・ニュースサイトからヘッドライン一覧を抽出する ・ページのURLを全て抽出する などなど今まで煩わしかったことが解消できます!

Rubyの開発環境

すでにRubyをインストール済みであればこの章を飛ばしてもらって大丈夫です。

1.rbenvのインストール

1.gitが入っているか確認しましょう。入っていなければインストール。

http://git-scm.com/download/mac
sudo yum -y install git

2.rbenvをgithubからclone,インストールしましょう

git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

3.環境変数を作成しrbenvの環境を整えましょう。

# PATH に追加
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile

# .bash_profile に追加
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

# 上記設定の再読み込み
$ exec $SHELL -l

4.rbenvが入っているか確認しましょう

$ rbenv --version
rbenv 0.4.0-74-g95a039a

5.ruby-buildをインストールしましょう

$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

クローンしてもインストールされていない場合は

~/.rbenv/plugins/ruby-build/install.sh

をしましょう。

6.rubyの最新版を確認しましょう

$ rbenv install --list
Available versions:
  1.8.6-p383
  1.8.6-p420
  1.8.7-p249
   :
   :
  2.2.0
  2.2.1
  2.2.2
  2.2.3       ← こいつが2.2系の最新版っぽい     
  :

7.ruby のインストールをしましょう 先ほどのバージョンを指定しましょう。

$ rbenv install -v 2.2.3

8.ruby のバージョン指定をしましょう

$ rbenv rehash
$ rbenv versions
* system (set by /home/vagrant/.rbenv/version)
  2.0.0-p353

systemが付いているバージョンが現在使用されているものです

rbenv global 2.2.3

最後に正しくsystemのところに2.2.3が来ていることを確認しましょう。

ruby -v

2.Nokogiriをインストール

rubyでスクレイピングをするにはNokogiriが必須です。Nokogiriについてはここで詳しく説明されていますので気になったら見てみると良いですね。 またgemのインストールにbundle, home brewを使うので予めインストールしておきましょう。

1.Nokogiriのインストール

gem install nokogiri

Railsを使わなければこれだけで大丈夫です。

Railsのプロジェクトで使う場合はGemfile

gem install nokogiri

と書きましょう。 次にターミナルでGemをインストールしましょう。

bundle install

3.とりあえずサンプルプログラムを使ってみよう!

3.1 ホームページタイトルの取得

以上環境設定が終わりましたので次にサンプルプログラムを使って、どのコードがどのような役割を担っているのか見てみましょう

まずscrape_yahoo_title.rbというファイルを作成し、下記のコードをコピペして貼り付けて見ましょう。

# URLにアクセスするためのライブラリの読み込み
require 'open-uri'
# Nokogiriライブラリの読み込み
require 'nokogiri'

# スクレイピング先のURL
url = 'http://www.yahoo.co.jp/'

charset = nil
html = open(url) do |f|
  charset = f.charset # 文字種別を取得
  f.read # htmlを読み込んで変数htmlに渡す
end

# htmlをパース(解析)してオブジェクトを生成
doc = Nokogiri::HTML.parse(html, nil, charset)

# タイトルを表示
p doc.title

作成したら、ターミナルで下記のコマンドを実行してみましょう。

ruby scrape_yahoo_title.rb

すると以下の様な結果が帰ってくれば成功です。

"Yahoo! JAPAN"

課題1 早稲田大学のホームページからタイトル「早稲田大学」を取得してみましょう。http://www.waseda.jp/top/

3.2 タイトル、画像一覧の取得

まず、ファイルad_navi.rbを作成します。作成したファイルをエディタで開いて次のようなソースを書きます。

require 'open-uri'
require 'nokogiri'
# スクレイピング先のURL
url = 'http://ad-navi.sendenkaigi.com/actor_company/'

charset = nil
html = open(url) do |f|
charset = f.charset # 文字種別を取得
f.read # htmlを読み込んで変数htmlに渡す
end

# htmlをパース(解析)してオブジェクトを作成
doc = Nokogiri::HTML.parse(html, nil, charset)

  doc.xpath('//div[@class="corp_data2"]').each do |node|

  p node.css('p[1]').inner_text

  p node.css('p.right.nomal').inner_text.match(/[0-9]+/).to_s.to_i

  p node.css('dl[3]/dd').inner_text

end

作成したら、ターミナルで以下のコマンドにより実行できます。

ruby ad_navi.rb

実行するとこのようが結果になるはずです。

"BBDO J WEST株式会社"
48
"福岡県/広島県/沖縄県/山口県"
"株式会社Gunosy"
70
"東京都"
"株式会社アズライフ"
42
"東京都"
"Glossom株式会社"
80
"東京都"
"株式会社ハタジルシ"
5
"東京都"
"アイビスティ有限会社"
4
"東京都"
...

課題2 早稲田大学のニュースページからニュースのタイトルと画像の一覧を取得してみましょう。http://www.waseda.jp/top/news

Pythonでのスクレイピングについても書いたので是非読んでください!

www.tsurutan.com

実践 Webスクレイピング&クローリング-オープンデータ時代の収集・整形テクニック

実践 Webスクレイピング&クローリング-オープンデータ時代の収集・整形テクニック

JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック

JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック

アプリ 広告収益 課金収益 インストール数 

f:id:tsurutan:20151203142909p:plain 今回は以前紹介したルーチンワーク管理アプリの、広告、課金収益、インストール数を公開したいと思います。

インストール数

f:id:tsurutan:20151203143056p:plain だいたい現在の時点でインストール数は2200くらいです。 1日40~50インストール増えている感じです。 2ヶ月前にリリースしたので月1100インストールづつ増えていますね。 ローカライズを頑張ったおかげか約6割のユーザーが海外の方です。

2015/3/4 f:id:tsurutan:20160304173741p:plain インストール数が11000人を突破しました。 現在1日に130インストールほど増えております。

広告収益

f:id:tsurutan:20151203143525p:plain 広告は10月の後半に表示し始めました。単価が高くて有名なAdmobを使っております。 1日平均100円程度利益が出ています。 そのうちバナーが4、インタースティシャルが6の割合で利益が出ています。 実際に単価を見て気づいたのですが、やっぱり日本のクリック単価は高いです。 今後日本ユーザーを増やしていくことを目標に頑張っていきたいです。

課金収入

f:id:tsurutan:20151203144124p:plain 課金機能は11月の初めに実装しました。 課金をすると広告類が全て表示されなくなります。 広告収入に比べると課金収入のほうが利益が出ています。 これはユーザー数がまだ少ないからなのではないかと考えております。

気をつけたこと

ASO対策

個人開発のため広告費などをかけられないので自然流入をいかに増やすかに注力した。 ASO対策では以下のポイントに気をつけた。 - アイコン - バナー、スクリンショット - 説明文に検索にヒットさせたいキーワードを3つ以上入れる 一番効果が出たのはアイコンを変更した時でした。

ローカライズ

どうせリリースするなら世界中の人に使ってもらおうと思い、9ヶ国語の翻訳を行いました。 英語は自分で翻訳ができましたが、他の言語の翻訳はできないのでGoogle翻訳を行いました。 たまに無料で翻訳をしてくれる神ユーザーが現れたりして、人々の優しさに感動しました。 翻訳をする国を選ぶのにグーグルデベロッパーコンソールに載っているカテゴリーで分けられたアプリの割合を参考にしました。

f:id:tsurutan:20151203152030p:plain

tsurutan.hatenablog.com

三日坊主にならないためのアプリをリリースしました!

f:id:tsurutan:20150927100211p:plain

日頃このようなことで悩んでいませんか?

「毎週やっていることなのに忘れていた!!」

「毎週やることに新しい習慣を取り入れたい!!」

「今日やるべきことをすぐに確認して安心したい!!」

そんな時に使ってほしい、ルーチンタスクを管理するアプリを作りました。

主な機能

  • ルーチンタスクの作成(1日か毎日やるかを選べる)
  • ルーチンタスクの編集
  • ルーチンタスクの削除
  • 全未チェック機能

使用方法

youtu.be

使い方はとても簡単で書くまでもありませんが,もしものために記しておきます。

ルーチンタスクを作りたいとき

  1. 右下に表示されているボタンを押します。

  2. ダイアログが表示されるので、そこにタイトルと内容を入力します。

  3. 毎日行うタスクの場合は「毎日やる」とか書かれたテキストに下になるチェックボタンを押します。

  4. 「OK」ボタンを押せば完成です。

ルーチンタスクを編集したいとき

  1. タスクをクリックします。

  2. ダイアログが表示されますので編集ボタンをクリックします。

  3. タスクを作成するときと同様に、タイトルと内容を編集します。

  4. 「OK」ボタンを押せば完成です。

ルーチンタスクを消したいとき

  1. タスクをロングクリックします。

  2. 警告ダイアログが表示されるので、「OK」ボタンを押すとタスクを削除することができます。

ルーチンタスクを全て未チェックにしたいとき

  1. 右上のアクションバーにあるチェックボタンのアイコンをクリックします。

  2. 警告ダイアログが表示されるので、「OK」ボタンを押すとタスクを全て未チェックにすることができます。

ランクインしました!!

2015/10/14 新着無料仕事効率化ランキング3位(Mobile)

f:id:tsurutan:20151014230237j:plain

新着無料仕事効率化ランキング1位(Tablet)

f:id:tsurutan:20151014230005j:plain

ダウンロード

とてもシンプルで使い易いアプリとなっているので、Androidをお持ちの方は是非インストールしてみてください。

ダウンロード

UNIX コマンド集

f:id:tsurutan:20150611113524p:plain

UNIXシェルとは

UNIXオペレーティングシステムおよびUnix系システムの従来からのユーザインタフェースを提供するコマンドラインインタプリタまたはシェルである。

です。コマンドを覚えてターミナルマスターになりましょう。

コマンド一覧

シェルコマンド

コマンド 説明
alias コマンドの別名(エイリアス)を登録
cd ディレクトリの移動
exit ログアウト
jobs ジョブの状態を表示
kill プロセス・ジョブを強制終了
unalias 登録されているコマンドの別名(エイリアス)を削除

ファイル・ディレクトリ操作

コマンド 説明
chmod パーミッション(所有権)の変更
chown ファイル・ディレクトリの所有者を変更
cp ファイル・ディレクトリをコピー
dd ファイルの変換・コピー
find どこにあるか分からないファイルを検索
history コマンド履歴の表示
ln リンクファイルの作成
ls ファイル・ディレクトリの情報を表示
merge ファイルの結合
mkdir フォルダの作成
mv ファイル・ディレクトリ移動・名前変更
pwd 現在のディレクトリの場所を表示
rm ファイル・ディレクトリを削除
rmdir ディレクトリ削除
sort 行を並び替える
split ファイルの分割
touch ファイルの最終アクセス日時と最終更新日時を変更

テキスト処理

コマンド 説明
cat ファイルを連結して表示
comm ファイルの内容を比較
diff ファイルの内容を比較
echo 文字列や変数の内容を表示
emacs テキストの編集
grep ファイルからパターン検索
less テキストを見る
more テキストを見る
uniq ファイルの重複行を削除して表示
vi テキストの編集
wc テキストファイルの行数・単語数・バイト数を表示

システム関連

コマンド 説明
chsh ログインシェルの変更
date 現在時刻を表示
env 環境変数の表示・設定
finger ユーザー情報を表示
groups グループ名を表示
id ユーザー名などを表示
login ログイン
mount ファイルシステムのマウント
passwd パスワードを変更する
shutdown システムをシャットダウン
su ユーザーの切替、管理権限の取得
w ログインしているユーザー名を表示
who 現在ログインしているユーザ情報を表示

ネットワーク関連

コマンド 説明
ftp FTPを使用してファイルを転送
hostid ホストコンピュータのIDを表示・設定
hostname ホストコンピュータの名前を表示・設定
ifconfig ネットワークインターフェース情報の表示・設定
ping ホストコンピュータとの接続を確認
rlogin ホストコンピュータにログイン
scp リモートホストとの間でファイル・ディレクトリをコピー
tcpdump ネットワークのパケットを取得
telnet ホストコンピュータにログイン

ジョブ

コマンド 説明
at 指定時刻にジョブを自動実行
atq ジョブの一覧を表示
atrm ジョブを削除
batch システム負荷状況によってジョブを自動実行
ps プロセス状態の表示

圧縮・展開

コマンド 説明
gzip gz(gzip形式)で圧縮・解凍
lha lzhファイルの圧縮・展開
tar tarファイルの圧縮・展開
unzip zipファイルの展開
uudecode uuencodeで作成されたファイルのデコード
uuencode バイナリファイルのエンコード
zip zipファイルの圧縮

印刷関連

コマンド 説明
lpc プリンターの制御
lpq プリンターの状態を確認
lpr プリンターで印刷
lprm 印刷キューの削除
lpstat プリントサービスの状態を表示

その他

コマンド 説明
cal カレンダーを表示させる
gcc C言語コンパイルを実行
man コマンドのマニュアルを表示
nkf 日本語の文字コードを変換
quota ディスク利用量の確認
time コマンド実行に要する時間を測定
whatis コマンドのマニュアルのヘッダを表示
which コマンドの場所を表示

環境変数

環境変数とは OSが提供するデータ共有機能の一つ。OS上で動作するタスク(プロセス)がデータを共有するための仕組みである。特に環境変数はタスクに対して外部からデータを与え、タスクの挙動・設定を変更する際に用いる。

シェルによって使える環境変数が変わりますので注意しましょう。

環境変数の例

変数名 説明
COLUMNS, LINES キャラクタ端末の桁数と行数を指定する。termcap/terminfo/cursesなどを利用したプログラムで利用される。他の方法(termcap、sttyなど)によって指定されていない場合に有効。
EDITOR エディタのコマンド名を指定する。エディタを起動するプログラム(mail、lessなど)で参照される。
HOME ホームディレクトリを指定する。cdコマンドで引数を指定しない場合、このディレクトリに移動する。例: /home/$USER
LANG ロケールを指定する。日本語ロケールの場合はjaまたはja_JPなどを指定する。setlocale()関数の呼び出しにより有効となる。
LESSCHARSET lessの入力・出力文字コードを指定する。
MAIL メールボックスのパス名を指定する。例: /var/mail/$USER, /usr/spool/mail/$USER
NAME ユーザの名前を指定する。メール送信時などに使われる。
PAGER ページャ(more、less、pgなど)を指定する。ページャを起動するプログラム(manなど)で使われる。
PATH コマンド検索パスをコロンで区切って指定する。シェルが参照する。
PWD カレントディレクトリが設定される。シェルスクリプトでpwdコマンドの代わりに$PWDを参照することがある。
SHELL 現在のシェルの起動パスが設定される。シェルを確認するのに利用できる。例: /bin/sh
TERM 端末種別が設定される。この値をキーとしてtermcap/terminfoデータベースが検索される。例: vt100
TERMCAP termcapデータベースファイルのパス、あるいは検索されたデータベースエントリの内容が設定される。例: /etc/termcap
TERMINFO terminfoデータベースディレクトリのパスが設定される。例: /usr/share/misc/terminfo
TZ タイムゾーン情報を指定する。標準Cライブラリの日時関連の関数で参照される。例: JST-9
USER ログイン名が設定される。
VISUAL スクリーンエディタのコマンド名を指定する。EDITORと同様。

すべてのUNIXで20年動くプログラムはどう書くべきか デプロイ・保守に苦しむエンジニア達へ贈る[シェルスクリプトレシピ集]

すべてのUNIXで20年動くプログラムはどう書くべきか デプロイ・保守に苦しむエンジニア達へ贈る[シェルスクリプトレシピ集]

UNIXの絵本 UNIXが楽しくわかる9つの扉

UNIXの絵本 UNIXが楽しくわかる9つの扉