R言語について

R言語について

R言語は統計解析用のプログラミング言語

とりあえず統計学はやらずツールの使い方

公式サイトは
http://www.r-project.org/

マニュアルについては
Documantation の Manuals を見ればOK
http://www.r-project.org/

ダウンロードするならCRAN から
http://cran.r-project.org/mirrors.html

ドットインストールでMac でのインストールなので
私の場合 Ubuntu でのインストールなので

ubuntu R言語
で検索し

UbuntuにR言語をインストール

を参考にインストール

最新版を試したいのなら別の方法で
とりあえず

sudo apt-get install r-cran-*

で全パッケージインストール

Rコンソールの使い方は
端末で

R

と入力すればOK

このRコンソールでは
オブジェクト
定義して終了時にソースコードでは
保管せずにまるごとイメージで保存できる

このためイメージを保存する作業ディレクトリが重要になる

通常はプロジェクトごとに作業ディレクトリを変えることになるので

mkdir R_Lessons

で作成

次に
起動時にこのディレクトリを参照するようにしたいのだが
ドットインストールではMac であり
ubuntu ではない

とりあえず
R commander というものがあり
これでできそうなので
R commander 設定 ubuntu
で検索

検索の結果
Rprofile
を編集すればよいみたい

http://stat.biopapyrus.net/dev/rprofile.html
によれば

R が起動すると自動的に
.Rprofile というファイルが読み込まれる

毎回行っている作業
ディレクトリの移動
よく使うライブラリーの呼び出しなどを
.Rprofile に書き込むことによって、自動化される

とのこと
しかし

ls -la 

でみても存在しないので
rprofile作り方
で検索

R起動時に特定の処理を毎回実行する

を参考に
R を起動して

getwd()

として
ディレクトリを表示

> getwd()
[1] "/home/snowpool"

となったので

 touch .Rprofile

でファイル作成

これで設定ファイルができたので
http://stat.biopapyrus.net/dev/rprofile.html
を参考に
作業ディレクトリを変更する

setwd("/home/snowpool/R_lessons/")

として保存

これで再度
R
として

getwd()

とすると

> getwd()
[1] "/home/snowpool/R_lessons"

となり
作業ディレクトリが変更されているのがわかる

モーダルダイアログ作成

モーダルダイアログ作成

モーダルダイアログは、ダイアログを消すまで他の部分を押せなくする表示方法

ユーザー登録とかログインのダイアログで使われる

これを実装するには

ダイアログ生成時に
AlertDialog.setCancelable
に false を設定することで実現できる

ソースにすると

AlertDialog.Builder alertDlg = new AlertDialog.Builder(this).setCancelable(false);
//タイトル設定
alertDlg.setTitle("モーダルダイアログ");
//本文設定
alertDlg.setMessage("本文");
//OKボタン設定
alertDlg.setPositiveButton("ok",new DialogInterface.OnClickListener(){

public void onClick(DialogInterface dialog, int which){
//今回は何もしない
}
});

//モーダルダイアログの表示
alertDlg.create().show();

これでモーダルダイアログが表示される

テキスト入力つきのダイアログ作成

テキスト入力つきのダイアログ作成

コメント欄とかをつけたダイアログ作成に使う

TwitterとかFacebookなどの投稿にも使えるし、メールアプリなどに使うのもわかりやすくなる

テキスト入力つきダイアログ作成するには
EditTextを表示できるレイアウトを作成し
setView()でAlertDialogのコンテンツとして割り当てる

まずは、レイアウトファイルを作成し
テキスト入力用のレイアウトを作成

<LinearLayout
xmlns:android="http://scheams.android.com/apk/res/android"
android:id="@+id/layout_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tweet !"/>

<EditText
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

</LinearLayout>

次に、JavaでAlertDialog.Builderの設定

//カスタムビューの設定
LayoutInflater inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);

final View layout = (LinearLayout)findViewById(R.id.layout_root);

//AlertDialog生成
AlertDialog.Builder builder = new AlertDialog.Builder(this);

//タイトル設定
builder.setTitle("Tweet Dialog");

//レイアウト設定
builder.setView(layout);

//OKボタン設定
builder.setPositiveButton("ok",new OnClickListener(){
public void onClick(DialogInterface dialog, int which){
EditText tweet = (EditText)findViewById(R.id.text);
String string = tweet.getText().toString();
}
});


//Cancelボタン設定
builder.setNegativeButton("cancel",new OnClickListener(){
public void onClick(DialogInterface dialog, int which){
//キャンセルなので何もしない
}
});

//ダイアログの表示
builder.create().show();

ダイアログの作り方は
作成したレイアウトを
LayoutInflater.inflate()で読み込んで
AlertDialog.setView()
でAlertDialogのコンテンツに割り当てている

ボタンつきのダイアログ作成

ボタンつきのダイアログ作成

よくあるものとしては
Yes/No Ok/Cancel
を選択するダイアログの表示に使われる
これは使用頻度が多く
ユーザー登録とかアプリの権限取得
ネットワーク接続など
いろんな使い道がある

ボタンつきダイアログ作成するには
AlertDialogを使うことでできる

ボタンつきダイアログの作成はJavaで行う

AlertDialog.Builder alertDlg = new AlertDialog.Builder(this);

//タイトル設定
alertDlg.setTitle("Dialog Title");
//本文設定
alertDlg.setMessage("本文");

//okボタンクリック時
alertDlg.setPositiveButton("OK",new DialogInterface.OnClickListener(){

public void onClick(DialogInterface dialog, int which){

}
});

//キャンセルボタンクリック時
alertDlg.setNegativeButton("Cancel",new DialogInterface.OnClickListener(){

public void onClick(DialogInterface dialog, int which){
}
});

alertDlg.create().show();

AlertDialog.Builderで
AlertDialogを生成し、タイトルやメッセージ、ボタンをセットしていく

高速スクローラの追加

高速スクローラの追加

ListViewを高速でスクロールしたいときに設置する

YouTubeとかTwitterクライアントアプリ作るなら必要になるし
データベース連携するときにも使うことになる

高速スクローラを追加するには
setFastScrollEnabled()で
高速スクローラを有効にする

有効にすると、
スクロールするコンテンツのボリュームに関係なく全体に対しての割合でスクロールが可能になる

かなり長いものをずっとスクロールし続けなくてよいので
操作のストレスを減らせる

これを設置すると、スクロールバーみたいなのができる

まずは、レイアウトファイルで画面を作成

<LinearLayout 
xmlns:android="http://scheams.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">

<Switch
android:id="@+id/switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="高速スクロール"/>

<ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"/>

</LinearLayout>

次に、Javaで高速スクローラの有効化

final ListView list = (ListView)findViewById(R.id.list);
list.setFastScrollEnabled(isChecked);
list.setFastScrollAlwaysVisible(isChecked);

setFastScrollEnabled()にtrueを設定すると
高速スクローラが有効化される

高速スクローラは、しばらくすると消えてしまうので
setFastScrollAlwaysVisible()で
高速スクローラを、常時表示にしている

画面の横スクロール

画面の横スクロール

画面を横にスクロールするには
HorizontalScrollViewを使う

HorizontalScrollViewは
ScrollViewと同じ要領で配置できる

HorizontalScrollViewは
画面を横にスクロールするViewGroup

使い道としては、
Google Playでアプリの紹介や解説のようにプレビューを作ったり
ギャラリーでサンプル表示などに使える

HorizontalScrollViewを配置するには
レイアウトファイルで配置すればok

<HorizontalScrollView
xmlns:android="http://scheams.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:orientation="horizontal">

<View
android:layout_width="@dimen/scroll_vertical_view"
android:layout_height="@dimen/scroll_vertical_view"
android:layout_margin="@dimen/padding_large"
android:background="@color/FlatLightAqua"/>

</LinearLayout>

</HorizontalScrollView>

HorizontalScrollViewを扱うときの注意点としては
HorizontalScrollViewの直下に
Viewの配置はできない

必ずViewGroup、つまり
LinearLayoutとかRelativeLayoutなどを設定して
その中へViewを配置すること

画像の縦スクロール

画像の縦スクロール

これは、コンテンツが表示しきれずに画面を縦スクロールするときに使う

ほとんどのお店や買い物リストなどの情報を扱うアプリでは使うことが多い

画面を縦スクロールするためには
ScrollViewを使う

ScrollViewを使うことで
内包するレイアウトはスクロール対象となり画面からはみ出る高さの場合
スクロールして表示される

例えば、YouTubeの場合
動画はそのままだけど
コメント欄はスクロール対象となるなど
常時見せたいコンテンツと解説
みたいなものを作るときに使える

まずは、レイアウトファイルで設定する

<ScrollView
xmlns:android="http://scheams.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:orientation="vertical">

<View
android:layout_width="@dimen/scroll_vertical_view"
android:layout_height="@dimen/scroll_vertical_view"
android:layout_margin="@dimen/padding_large"
android:background="@color/FlatLightAqua"/>
</LinearLayout>
</ScrollView>

これで、縦スクロールが可能になる

ただし
ScrollViewがスクロールできるのは
ViewGroupを継承したクラスだけになる
このため
LinearLayoutやRelativeLayoutとかですでに作成されたレイアウトファイルでスクロールしたいのなら
外側にもう一つレイアウトクラスをつくり挟むようにする

Androidで、最後まで表示したら自動で項目追加

Androidで、最後まで表示したら自動で項目追加

Twitterとかでよくみる、一番下までみると
次のリストを読み込むのを実装

これは、大量にあるデータをすべて読み込まずに
リストの最後尾が表示されたら
逐次読み込むリストを作る

これには、OnScrollListenerを使い
最後まで読み込まれたか判定して、データを追加することでできる

項目の自動追加はJavaで行う

まずは、implementで使えるようにするので

extends OnScrollListener

を追加する

あとは、onCreate()へ処理を追加

mlistView = (ListView)findViewById(R.id.list);

//読み込み中のフッター生成
mFooter = getLayoutInflater().inflate(R.layout.progres_item, null);

//ListViewにフッター設定
mlistView.addFooter(mFooter);

//スクロールリスナー設定
mlistView.setOnScrollListener(this);

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount){
//末尾の場合、次のアイテム読み込み
if(totalItemCount == firstVisibleItem + visibleItemCount){
additionalReading();
}
}

@Override
public void onScrollStateChanged(AbsListView arg0, int arg1){
}

private void additionalReading(){
//すでに読み込み済みならスキップ
if(mTask != null && mTask.getStatus() == AsyncTask.Status.RUNNING){
return;
}

/*通常はネットワークやファイルからデータが読み込まれるため非同期に読み込み処理を実装する

今回は、サンプルなので非同期処理はそのままで
データ読み込みを意図的に遅延処理にしている

mTask = new AsyncTask(this).execute(test);

}

最後までスクロールしたときの判定基準は
firstVisibleItemと
visibleItemCountを足した値が
totalItemCountになったときに
ListViewの最後に到達したと判断し
追加の呼び出し処理をしている

ListViewの表示を独自レイアウトで表示

ListViewの表示を独自レイアウトで表示

使い道としては、画像つきリスト表示など

クックパッドやYouTubeみたいに
サムネイル表示などに使えそう

ListViewに独自レイアウトを表示するには
表示を司るAdapterクラスを拡張する必要がある

まずは、レイアウトファイルを作成して
項目用レイアウトを作成

<LinearLayout
xmlns:android="http://scheams.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">

<ImageView
android:id="@+id/image"
android:layout_width="60dip"
android:layout_height="60dip"/>

<TextView
android:id="@+id/text"
android:layout_width=""wrap_content
android:layout_height="wrap_content"
android:choiceMode="singleChoice"/>
</LinearLayout>

android:choiceMode=”singleChoice”
は、単一行のみチェック可能にする
参考サイトは
http://blogand.stack3.net/archives/83

今回は、リストアイテムとして
画像と文字にしたかったので
60×60の画像と
文字の大きさにあわせるTextViewにしている

次に、Javaで独自レイアウトの設定
ListViewに独自レイアウトを設定するため
ArrayAdapterクラスを継承し
getView()をOverrideする

public class CustomAdapter extends ArrayAdapter<CustomData>{

private layoutInflater mlayoutInflater;

public CustomAdapter(Context context,int  textViewResourceId, List<CustomData> objects){
super(context,textViewResourceId, objects);
mlayoutInflater = (layoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public View getView(int position, View convertView, ViewGroup parent){

//特定の行 position のデータを得る
CustomData item = (CustomData)getItem(position);

//同じ行に表示されるViewは使い回しされるので初回だけ生成
if(null == convertView){

convertView = mlayoutInflater.inflate(R.layout.list_item,null);
}

//データをViewの各widgetにセット
ImageView imageView;
imageView = (ImageView)findViewById(R.id.image);
imageView.setImageBitmap(item.getTextData());

return convertView;
}

}

これで、画像つきのリスト表示ができる

ディズニーeチケットとコンビニ印刷

【お得技シリーズ010】東京ディズニーランド&シー お得技ベストセレクション (晋遊舎ムック)
を参考に
インターネットからチケットの購入をしました

これは eチケット意外の場合
現地でチケットを引換する必要があり並ぶことになります

さすがに貴重なお休みを並んで削っていくのはかなり厳しそうなので
ならばなくて済みそうな eチケットを購入

問題点は2つあり
パソコンとプリンターなどの印刷するものがほしいということ
そして印刷するのに時間制限があること

サイトでは flash を使っているので非対応なブラウザだから
スマホではダメかと思って firefox など別のブラウザで試したけど
ダメなのでパソコンから購入

ここまではいいけど、問題は残り2つの問題

まず印刷の期限
これはどうやら購入した当日に印刷しないとダメ
ただし
PDFファイルにしておけば、後で印刷も可能です

やり方については
プリンターなくてもOK!eチケットをコンビニで印刷
を参考にするとわかりやすいです

問題はのこる印刷方法

自宅にプリンターがあればいいけど
ない場合は
コンビニなどで印刷になります

セブンイレブンのネットワークプリントでもできると聞いたのですが
ファイルを預ける場合容量制限があるため
2人ぶんのデータを転送しようとしたらエラーになりました

私の場合、Android だったので
MicroSD へPDFデータを移して
これを取り出して近くのローソンで印刷しました

もっともパソコンでデータ取得しているので
USB とか microSD などに
パソコンからデータを移して、コンビニ印刷すればそれで解決しそうですが