2015年8月18日火曜日

PHPでの「->」の意味

PHPの「->」の意味が分からなかったが、下記ページで理解できた。

参照URL
http://www.phppro.jp/qa/536
http://tdak.hateblo.jp/entry/20140406/1396773476


つまり、javaでいう「.」のこと。

Hogeクラスがあったとして、
Hoge hoge = new Hoge();
hoge.Hogeクラスの変数やメソッド
みたいに呼び出すのと同じ。

2015年8月7日金曜日

Android の apk ファイルの解析

・MAC

1. ~.apk のファイルの拡張子を .zip に変更し解凍する。

2. classes.dex ファイルを jar ファイルに変換する。
dex2jar というツールを使用する。

※詳細は以下のページを参照しました。
http://qiita.com/le_skamba/items/04c0a0cfe420be862122#%E3%82%B9%E3%83%86%E3%83%83%E3%83%973-dex--jar

http://sourceforge.net/projects/dex2jar/

ポイントとしては、実行権限をつけてあげる。
(該当のフォルダまで cd で移動して、chmod +x *)
Mac だと、拡張子 .sh のファイルを使う。
(d2j-dex2jar.sh classes.dex)

3. jar ファイルの拡張子を .zip に変更し解凍する。

4. ~.class ファイルを java ファイルに変換する。
使用するツールは、上記サイトを参考に、JavaDecompiler を使う。

http://jd.benow.ca/

JD-GUI
にてMAC なら jd-gui-osx-1.4.0.tar をダウンロード。
実行して、class ファイル選択すると、まとめて表示される。


・最近は、
androguard を使うのが、良いらしい。

https://code.google.com/p/androguard/wiki/Installation

が、導入方法がさっぱり分からん。

2015年7月30日木曜日

MAC でデフォルトのテキストエディタを変更する方法

ファイルを右クリックから、「このアプリケーションで開く」から選択しても、開けるもののデフォルトになってくれない。

以下参照
http://www.lastday.jp/2011/10/25/mac-open-favorite-app-as-default

同じく右クリックから、「情報を見る」で、一覧から「このアプリケーションで開く」の項目を選択し、アプリケーションを選択後、「すべてを変更…」押下で、選択したものがデフォルトになってくれる。

2015年7月29日水曜日

Ruby での加算子

よくある「++」はないので、
hoge += 1
とする。

それどころか、へたに++なんていれると、次の行が文法エラーとなったり、次の行の何かと連結できてしまうと、おかしな挙動になる。
++がダメ、とピンポイントで指摘してくれないので、ハマった。。

2015年7月28日火曜日

2015年7月15日水曜日

画面を縦に固定

マニフェストの activity タグに以下を記載。
android:screenOrientation="portrait"

シングルトン

以下のサイトを参考に。
https://sites.google.com/site/androidappdojo/home/lesson/section04/section0405

クラスを使うときの new を呼び出し元ではなく、呼び出し先のそのクラス自身に任せる的な。

コンストラクタは、private にして制限。
getInstance() で呼び出すように書く。

とはいえ、コンストラクタがpublic じゃないと、画面回転させた時などに落ちる。

2015年7月14日火曜日

ダイアログ フラグメント

ダイアログ出すにも、DialogFragment を使えということなのでメモ。
※参考URL
http://developer.android.com/reference/android/app/DialogFragment.html#AlertDialog
http://quesera2.hatenablog.jp/entry/2014/04/09/003146
のFragment→Fragment→Fragment のところ。
http://www.fkmsoft.jp/blog/software/android/fragment/dialog_2.html

アラートダイアログ以外を表示するには、 new AlertDialog.Builder の部分を変更。
ただし表示するものによって、必須の指定があるので、要確認。
たとえば、ドラムロールのTimePickerDialog だと、「~~ extends DialogFragment implements TimePickerDialog.OnTimeSetListener」として、Override で onTimeSet が必須になる。あとなぜか return new ~~~ .create(); じゃだめで、変数宣言して、それをリターンしてやらないとエラーだった。

また、.setView のところ、上記の例では EditText のウィジェットをjavaで生成して入れているが、これも好きなもの(seekbarとか)を入れられるし、レイアウト(XML)で凝ったものでも作ってインフレートしてからセットすることも試してないが、可能かと。

なお、フラグメントから呼び出したダイアログフラグメントより、呼び出し元のフラグメントへ処理を返す方法も記述。
呼び出す際に setTargetFragment しておき、呼び出し先で、getTargetFragment にて取得し、onActivityResult で返してやる。

※最後に。 上記の例では、フラグメントと、ダイアログフラグメントを分離しているが、
フラグメントクラス内にダイアログフラグメントを記述する場合は、public static とする。
「public class MyAlertDialogFragment extends DialogFragment」
 ↓
「public static class MyAlertDialogFragment extends DialogFragment」
意味としては、これは親クラスとは関係ないよ、という宣言。

2015年7月10日金曜日

Java メモ

・数値を文字に変換
String str = Integer.toString(num);

Calendar

カレンダークラスで日時などを指定する方法

・共通
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.setTimeZone(TimeZone.getDefault());

・毎日
例えば11時10分0秒なら、
calendar.set(Calendar.HOUR_OF_DAY, 11);
calendar.set(Calendar.MINUTE, 10); //02などはいけるが、なぜか08以降はダメ。0不要か。
calendar.set(Calendar.SECOND, 0);
※時間指定のみなので、毎日となる。
※なお、秒を指定しないと1分程度遅れた。0秒指定で端末時間でジャスト起動。

・比較
各変数は、以下とする。
現在時刻:calendarNow
設定時刻:calendarSet
int num = calendarNow.compareTo(calendarSet);
if(num>0){
    Log.d("time","現在時刻が、設定時刻より進んでいる。");
}

・メソッドなど詳しく紹介しているサイト
http://www.techscore.com/tech/Java/JavaSE/Utility/8/
add  と roll の違いなど。

・翌日
今日のCalendar.DAY_OF_YEARがsetされているor最初から何も指定していないとして、
calendar.add(Calendar.DAY_OF_YEAR, 1);
すれば、翌日。
Calendar.DAY_OF_YEAR は一年のうちで、今日が何日目か。
なお年末でも大丈夫。

・時刻取得
get メソッドで取得。何もsetしてなければ、現在時刻を取ってくる。
int hour = calendarNow.get(Calendar.HOUR_OF_DAY);
※何かsetしていると、その設定したものを取ってくる。

・正確さ
秒まで指定しないと、1分くらい遅れた。(0秒指定で、分変わりジャスト)

・備考
calendar.set(Calendar.MINUTE, 5);
みたいに数字を書く。
たとえば05という風に書くと、08からなぜかエラー。

2015年7月9日木曜日

R.id.hoge とかのリソースを動的に読み込む方法

以前の記事で、最後に触れている
http://yazakikenji.blogspot.jp/2011/12/imageview.html

が、再掲。

例。
ImageView imageView;

imageView = (ImageView) getView().findViewById(R.id.imageView1);

同じことを動的にやるには、
String str = "1";

imageView = (ImageView) getView().findViewById(getResources().getIdentifier("imageView"+str,"id",getActivity().getPackageName()));

実際には、上記のstrは数字(連番)で持たせて処理の中で、forループなどで使う形になると思う。

・getIdentifier の詳細
第一引数は、XML ファイルで定義したIDを入れる。
同一の名前で最後に数字を連番でつけるのが楽か。(名前が違うと当然エラーになるので注意!XML側でつけたIDの命名規則が一部違っているとかもそう。)
第二引数は、
R.id なら"id"
R.drawable なら"drawable"
となる。
第三引数は、パスの指定だが、それはパッケージ名となる。getPackageName() を使わず、直書きでもいい。なおフラグメントで使うことを想定して、getActivity() している。

2015年7月7日火曜日

レイアウトのクリック可能範囲と、バックグラウンドの反応

java 側にて、OnClickListener を設定したり、
Layout (XML) 側にて、クリック可能なものを設置した場合、
クリック可能範囲が、(なんと表現すべきか)XMLタグの深い方(中にある方)が優先される模様。

なので、例えば表のLinearLayout のbackground に、クリックしたら色が変わるような設定のファイルを置いても、(もちろんclickable="true")
その内部のLinearLayout でもTextView、ImageView でも、クリック可能になった場合、そのクリックイベントが優先されるため、表のLinearLayout の設定は生きない。

もっとも、何かしら隙間があれば、そこをタッチすれば、そこだけは反応してくれるが。

Fragment の作成、遷移

フラグメント

ListFragment の使い方

リストフラグメント。
実装するクラスに、extends ListFragment して、以下。

fragment_test.xml
id のとこ、android:list とするのね。 test.xml は省略。

なお、リストをクリックすると、別のフラグメントが起動するよう処理を書いている。
その際、newInstance() などと書いているが、この手の実装は次の投稿で。

2015年7月6日月曜日

ListView で文字を縦に2つ並べた時に、最初にタッチすると、なぜか間に区切り線が出てくる件。

なんだかよく分からないが、Layout の高さを指定したら、直った。

LinearLayout で作成したリスト的なものに、ListViewで使われる罫線を入れる。また、タッチした時に背景の色が変わるようにする。

・罫線
layout 配下に適当な名前で、以下を作成。
hoge.xml
<View xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="1dp" android:background="?android:attr/listDivider" />

あとは、差し込みたい場所に
<include layout="@layout/hoge" />
で入れる。


・タッチ時背景色変更
プロジェクト作成時に、自動的に?作られていたものを設定。
android:background="@drawable/stamp_item_bg"

stamp_item_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_pressed="true"
        android:drawable="@drawable/stamp_item_bg_pressed" />
    <item android:drawable="@android:color/transparent" />

</selector>

2015年7月2日木曜日

リストにヘッダーをセットした場合の注意点

リスト表示のヘッダー、フッターに何かを挿入したい場合。

TextView textView = new TextView(getActivity());
textView.setText("This is Header");
getListView().addHeaderView(textView, null, false);

アダプターの追加
setListAdapter(adapter);

みたいに、
setListAdapter() する前に addHeaderView() してあげる必要がある。

しかし、ここで注意点。

このままだと、他画面に移って、また上記の画面に戻った場合、エラーで落ちる。
理由は、既にsetListAdapter() されてるから addHeaderView() できません。

つまり、アダプターが破棄されずに残っている。

これを回避するには、
@Override
public void onDestroyView() {
    super.onDestroyView();
    setListAdapter(null);
}

このように、onDestroyView() にて、アダプターをnull してやる。

なお、アウトオブメモリー対策にもなる模様。

AndroidStudio で、Uploading file で止まる。

ビルド中、
Uploading file
 local path: ~~~.apk
 remote path: ~~~
で止まってしまう現象。

どうもソースツリーとかで他人のプロジェクトを触っている時に発生。

メニューから、
Build -> Clean Project
をして、直ったっぽい。

と思ったら、再発。

プロジェクトのルートで、
./gradlew clean packageDebug
で様子見。

…また再発。

どうもUSBケーブルが悪かったようで、交換したら直った。

追記)
交換後も、たまに再発。
どうも端末にもよるらしい。
また、人に聞いたら、やっぱり端末によっては、かなり頻発するらしい…

2015年6月29日月曜日

言語をまたいだcookieの使用

php で
setcookie('hoge', '1', time() + 3600, '/');
でセット。

JavaScript で
cookies.js なんかを入れれば
var cookies = docCookies.getItem("hope");
で取得して使える。

2015年5月28日木曜日

特定の画像上に、相対的に何か要素を配置したい場合

<div class="relative">
<img src="test.jpg">
<div class="absolute">
<table>
~
</table>
</div>
</div>


.relative{
  position: relative;
  width: 500px;
  margin: 0px auto;
}
.absolute{
  position: absolute;
  top: 100px;
  left: 100px;
}


これでテーブルが置かれる場所は、画面トップから100px、左から100pxではなく、
test.jpg 画像のトップから100px、左から100pxとなる。

CSS position absolute の指定について

position: absolute;
top: 10px;
left: 5px;
みたいに書いたとして、その場所に他の何かがないと、表示されない。
background で画像の指定などをしても、ダメ。

<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
とか書けばOK。

2015年5月12日火曜日

SDカードへのインストール

Manifest ファイルにて、
<manifest タグの中に
android:installLocation="preferExternal"
と書く。

2015年3月12日木曜日

gsub! の返り値

str = ""
p str.gsub!("\n","")
p str
str = "A\nB"
p str.gsub!("\n","")

とした場合、それぞれ
nil
""
"AB"
となる。

なので、(必ずしも改行があるわけではないが)改行があった場合に、それを取り除いたものがほしいとして、
hoge = str.gsub!("\n","")
と書くと、
改行があれば、「改行を取り除いた文字列」が変数hogeに入るが、
改行がない場合は、「そのままの文字列」ではなく、「nil」が変数hogeに入ってしまう。

あくまで変数strそのものを参照していけばいいのだが…つい癖で。

または、include? で確認してから使う。

2015年2月27日金曜日

Fragment

フラグメントのメモ。
正直、フラグメントは勝手が分からず、ツラい。

・前の画面(前のフラグメント)に戻る。
getFragmentManager().popBackStack();
と書けばいい。

ただし、フグラメントがネスト(※)されている時、子フラグメントからだと、上記コードでは無理。
getParentFragment() を使って、親フラグメントを取得する必要がある。
つまり、
getParentFragment().getFragmentManager().popBackStack();
となる。

※ネスト…フラグメントからフラグメントを呼び出している(親フラグメントから子フラグメント)。
getChildFragmentManager とか使ってるパターン。


・アクティビティで出来たことを、フラグメント内でやる場合のパターン
getActivity() を使う。

2015年1月21日水曜日

正規表現 メモ

 ・行頭
^

・行末
$

・文字Aから文字Bの間
A.+?B

・文字Aから末尾まで。
/A.+?$/

2015年1月18日日曜日

[Ruby] csvデータを読み込み処理して、csvデータ形式で出力。


CSVデータの1行分。
CSVデータの実態はテキストファイル。カンマを目印に分割できる。

※セル内に改行がある場合は、そこで分割されてしまうので、上記の方法では無理。
いろいろ考えはあると思うが、
require 'csv'
を使うやり方がある。

require 'csv'

CSV.foreach(filename) do |row|

end

※空欄は「""」ではなく、「nil」になるので注意。

2015年1月12日月曜日

[Android] 一部の文字の色を変える。

文字に下線を引くとかだと、XMLのみの記述でいけるが、色の変更は反映してくれないようだ。

解決方法としては、java側で文字をセットする。
その際、Html.fromHtml() を使う。

TextView textView = (TextView) findViewById(R.id.hoge);
textView.setText(Html.fromHtml(getString(R.string.piyo)));

あとは、
<string name=“piyo”>テスト&lt;font color=\"red\"&gt;色を変えたい文字&lt;/font&gt;テスト</string>
こんな感じで書く。
※<>は、&lt; &gt; と書いたり。

2015年1月11日日曜日

JavaScript メモ

・以下3つが連携。
1. CSS   デザインを指定
2. HTML  要素とテキストのみ。プログラムは含まない。
3. JavaScript コードのみを記述。HTMLと混ぜない。

・変数
var 付けなくても使えるが、全てグローバルになる。

・連想配列がある
配列の添字に数字だけでなく文字を指定できる。

・無名オブジェクトの配列変数で、複数のデータを格納できる

<script type="text/javascript">

var data = [

{name:'あああ', tax: 3} ,

{name:'いいい', tax: 5} ,

{name:'ううう', tax: 8}

];

</script>

⇒呼び出しは、
prod_data[0].name
prod_data[0].price
prod_data[1].price

※また、多次元配列を使えば、いちいち名前を割り振らずに、値をそのまま格納することもできる。
var data = [
['名前','税率'],
['あああ', 3] ,
['いいい', 5] ,
];

この場合、prod_data1[0][0]で名前となる。以下。(2次元配列)
00 01
10 11
20 21

・CSS
class="hoge"
とタグに書いてあったら、
style タグにて、
.hoge {color:red}
みたいに指定されているはず。

・関数の定義
function hoge ()
と書く。
※最後に()が付けばメソッド名として扱われる。

・ログ
console.log(text);

・エラー確認
FirefoxDeveloperEdition
とかで、WEBコンソールで確認可能。

・html の書き変え
<body>
<span id="hoge">
<script>
window.onload=function() {
document.getElementById("hoge").innerHTML = '<p>test</p>';
}
</script>
</body>
または、上記のspanタグの記述の後で、
function testfunc() {
document.getElementById("hoge").innerHTML = '<p>test</p>';
};
testfunc();

・jQuery
$(function(){

});

2015年1月7日水曜日

PHP メモ

PHP はHTML の生成に使われる。
PHP はHTML のコードと混ぜて書くことができる。

・開始、終了タグ
開始タグ <?php
終了タグ ?>

・変数
$ が付いてるのは変数。

・繰り返し(foreach文)
foreach ($results as $i)
results変数の中身をi変数に移して、要素が終わるまで繰り返す。

・デバックするときは、
var_dump($i);
で、わりと何でも出してくれる。
※文字化けが発生した場合も、文字化け状態で出力してくれる。

・empty
カラの場合にTRUE
在る場合はFALSE

・三項演算子
(条件) ? (TRUEの場合に返す値) : (FALSEの場合に返す値)

2015年1月3日土曜日

Ruby メモ

・文字列を囲むのに、
"" 特殊文字(\nとか)を解釈する。
''  特殊文字を解釈しない。

・p オブジェクトの中身を表示。

・コメントの書き方
先頭に#
または、
=begin
(~~~)
=end

・条件文
if ~ then
elsif ~ then (elseif ではない。)
while ~ do
※最後のthen,do は省略可能。
締めは、
end

・繰り返し処理
■ each文
hoge.each { | piyo |
(hoge変数の中身が、順にpiyo変数に入るので、そのpiyo変数に対して繰り返したい処理を書く。)
}

■ for文
for i in 0..5

end
(0〜5まで繰り返す。加算される変数iを使いたい時に用いる)

・正規表現
=~ 正規表現でマッチングを行う時に使う。

・null じゃなくて nil
また条件判断にて、偽として扱われる。

・コマンドラインからのデータ入力
ARGVという配列オブジェクトが受け取る。(ARGV[0])

・メソッド
def メソッド名 (引数)
※引数にはデフォルト値を設定出来る。
返り値は、最後の行(条件文の場合はそれぞれ)が自動的になる。
return で明示した場合は、そこでメソッドが終了する。

・クラスの作成
class クラス名
   def initialize()
end
※クラス名は大文字から始める
※initializeメソッドはJavaでいうコンストラクタ

・変数
@hoge…インスタンス変数。インスタンスごとに割り当てられる。
@@hoge…クラス変数。そのクラスの全てのインスタンスで共有。

・文字を特定文字で分割
コンマ区切りなら、
hoge.split(/,/)

・String変数に文字を追加
@text << "てすと"

・上から実行するので、メソッドを下に書くとエラー

・型を調べる
p hoge.class

・◯◯が含まれているか?
hoge.include?("◯◯")

・変数は、参照渡し(値渡しではない)なので注意。
破壊的操作を行う場合は、必要に応じて値をコピーするような記述をする。
hoge = piyo.dup
など。

・スライス
例えば、「/」と「・」で分割したい場合
split(/[\/・]/)
※「/」の前にはバックスラッシュを入れる。