Translate

2015年11月24日火曜日

継承におけるStatic

class Sample{
 public static void main(String[] args){
  A obj = new C();
  obj.hoge();
 }
}

class A{
 static void hoge(){
  System.out.println("A");
 }
}

class B extends A{
 static void hoge(){
  System.out.println("B");
 }
}

class C extends B{
 static void hoge(){
  System.out.println("C");
 }
}

これは A


class Sample{
 public static void main(String[] args){
  B obj = new C();
  obj.hoge();
 }
}

class A{
 static void hoge(){
  System.out.println("A");
 }
}

class B extends A{
 static void hoge(){
  System.out.println("B");
 }
}

class C extends B{
 static void hoge(){
  System.out.println("C");
 }
}

これは B


class Sample{
 public static void main(String[] args){
  C obj = new C();
  obj.hoge();
 }
}

class A{
 static void hoge(){
  System.out.println("A");
 }
}

class B extends A{
 static void hoge(){
  System.out.println("B");
 }
}

class C extends B{
 static void hoge(){
  System.out.println("C");
 }
}

これは C

class Sample{
 public static void main(String[] args){
  A obj = new C();
  obj.hoge();
 }
}

class A{
 static void hoge(){
  System.out.println("A");
 }
}

class B extends A{
}

class C extends B{
}

これは A


class Sample{
 public static void main(String[] args){
  B obj = new C();
  obj.hoge();
 }
}

class A{
 static void hoge(){
  System.out.println("A");
 }
}

class B extends A{
}

class C extends B{
}

これも A


class Sample{
 public static void main(String[] args){
  C obj = new C();
  obj.hoge();
 }
}

class A{
 static void hoge(){
  System.out.println("A");
 }
}

class B extends A{
}

class C extends B{
}

これでも A

そういうものなのか・・・

例外

public class Sample {
 public static void main(String[] args){
  try{
   String[] string = new String[2];
   System.out.println(string[0]); //null
   System.out.println(string[1].toString()); //ここでエラー
  }catch(Exception e){
   System.out.println(e); //NullPointerException
  }
 }
}

nullを出力できるが toString()は実行時エラー

String

public class Sample {
 public static void main(String[] args){
  String str = "ABCDABC";
  
  System.out.println(str.charAt(1));
  System.out.println(str.length());
  
  String str2 = (String)str.subSequence(4, 7);
  System.out.println(str2); //CBA 範囲を超えると IndexOutOfBoundsExceptionがスロー
  
  System.out.println(str.indexOf('B')); //1
  System.out.println(str.indexOf("CD"));//2
  
  System.out.println(str.indexOf('B', 3)); //5
  System.out.println(str.lastIndexOf('A'));//4
  
  System.out.println(str.startsWith("ABC")); //true 先頭から始まっているか?
  System.out.println(str.startsWith("CD", 1)); //false 2文字目からCDで始まっているか?
  System.out.println(str.startsWith("CD", 2)); //true 3文字目からCDで始まっているか?
  System.out.println(str.endsWith("DABC")); //true DABCで終わるか?
 }
}


equalは、文字列の比較
== は、参照しているObjectが一緒の場合 true

public class Sample {
 public static void main(String[] args){
  String str1 = "ABC";
  String str2 = "AB";
  str2 += "C";
  System.out.println(str1 == str2);      //false
  System.out.println(str1.equals(str2)); //true
  
  String str3 = "CD";
  String str4 = "CD";
  System.out.println(str3 == str4); //true 
  
  String str5 = "EF";
  String str6 = new String("EF");
  System.out.println(str5 == str6); //false
 }
}

StringBuilderの場合
public class Sample {
 public static void main(String[] args){
  StringBuffer str1 = new StringBuffer("ABC");
  StringBuffer str2 = new StringBuffer("ABC");
  System.out.println(str1 == str2); //falase
  
  str1 = str2;
  System.out.println(str1 == str2); //true
 }
}

2015年11月23日月曜日

ArrayList

■追加

値のみで、一番最後に追加、
indexと、値でindex番号に追加

import java.util.List;
import java.util.ArrayList;

public class Sample {
 public static void main(String[] args){
  List list = new ArrayList();
  list.add("a");
  list.add("b");
  list.add("d");
  list.add("e");
  
  list.add(2, "c"); //途中に追加
  list.add(list.size(), "f"); //最後に追加

  String[] arrStrings = (String[])list.toArray(new String[list.size()]);
  System.out.println(String.join(", ", arrStrings));


 }
}

一番最後の要素+1(size)より大きい数字を指定するとエラーになる。
java.lang.IndexOutOfBoundsException: Index: 100, Size: 6

addAllはリストごと追加
import java.util.List;
import java.util.ArrayList;

public class Sample {
 public static void main(String[] args){
  List listA = new ArrayList();
  listA.add("a");
  listA.add("b");
  listA.add("c");
  
  List listB = new ArrayList();
  listB.add("d");
  listB.add("e");
  listB.add("f");
  
  listA.addAll(listB);
  
  String[] arrStrings = (String[])listA.toArray(new String[listA.size()]);
  System.out.println(String.join(", ", arrStrings));
 }
}


ほかいろいろ。
import java.util.List;
import java.util.ArrayList;

public class Sample {
 public static void main(String[] args){
  List list = new ArrayList();
  System.out.println(list.isEmpty()); //true 
  
  list.add("a");
  list.add("b");
  list.add("c");
  list.add("b");
  list.add("a");
  
  System.out.println(list.contains("c")); //true
  System.out.println(list.contains("d")); //false
  
  
  System.out.println(list.get(0)); //a
  System.out.println(list.indexOf("b")); //1 最初から探査して最初にマッチする要素
  System.out.println(list.lastIndexOf("b")); //3 最後から探査して最初にマッチする要素
  
  list.set(3,  "z"); //4番目の要素をdに変える
  list.remove("a"); //最初にマッチしたaを消す
  list.remove(list.size() - 1); //最後の要素を消す
  
  String[] arrStrings = (String[])list.toArray(new String[list.size()]);
  System.out.println(String.join(", ", arrStrings)); //b, c, z
 }
}

コレクション

■Deque
import java.util.ArrayDeque;
import java.util.Deque;

public class SampleCode {
 public static void main(String[] args){
  Deque dq = new ArrayDeque();
  dq.add(3);      //末尾に追加
 
  dq.push(2);     //先頭に追加
  dq.addFirst(1); //先頭に追加
  
  dq.offer(4);    //末尾に追加
  dq.addLast(5);  //末尾に追加

  System.out.println("--element--");
  System.out.println(dq.element());  //1 先頭の要素を取得、削除せず
  System.out.println("--peek--");
  System.out.println(dq.peek());     //1 先頭の要素を取得、削除せず
  System.out.println(dq.peekFirst());//1 先頭の要素を取得、削除せず
  System.out.println(dq.peekLast()); //5 末尾の要素を取得、削除せず
  System.out.println("--get--");
  System.out.println(dq.getFirst()); //1 先頭の要素を取得、削除せず
  System.out.println(dq.getLast());  //5 末尾の要素を取得、削除せず

  System.out.println("--poll--");
  System.out.println(dq.poll());     //1 先頭の要素を取得、削除する
  System.out.println(dq.pollFirst());//5 末尾の要素を取得、削除する
  System.out.println(dq.pollLast()); //2 先頭の要素を取得、削除する
  
  System.out.println("--pop--");
  System.out.println(dq.pop());      //3 先頭の要素を取得、削除する
  
  System.out.println("--remove--");
  System.out.println(dq.remove());   //4 何も指定しないと先頭の要素を削除
 }
}


push 先頭に追加
add, offer 末尾に追加

element, peek 先頭、削除せず
poll, pop,remove 先頭、削除する


■HashMap
package localhost;

import java.util.HashMap;
import java.util.Map;

public class SampleCode {
 public static void main(String[] args){
  HashMapmap = new HashMap();
  map.put("A", 1);
  map.put("B", 2);
  map.put("B", 3);
  
  for(String key : map.keySet()){
            System.out.println(key + ":" + map.get(key));
        }

        for(Integer val : map.values()){
            System.out.println(val);
        }
        
        for(Map.Entry e : map.entrySet()){
         System.out.println(e.getKey() + ":" + e.getValue());
        }
 }
}


C#と異なり、キーがかぶっても何もいわないとこかな。

2015年11月21日土曜日

javaでコンパイル した際の.classファイルの数

めもめも。

public class Outer {
}

コンパイル:
Outer.class
---------------------------------------------------
public class Outer {
  private class Inner{}
}

コンパイル:
Outer.class
Outer$Inner.class
---------------------------------------------------
public class Outer {
  private class Inner{} //privateなコンストラクタができている

  private void hoge(){
    new Inner(); //privateなコンストラクタ持ちの内部クラスをコンパイルすると・・・
  }
}

コンパイル:
Outer.class
Outer$Inner.class
Outer$1.class
---------------------------------------------------
public class Outer {
  public class Inner{} //publicにすれば Outer$1.classはできない

  private void hoge(){
    new Inner();
  }
}

コンパイル:
Outer.class
Outer$Inner.class
---------------------------------------------------
public class Outer {
  public class Inner{
    private Inner(){} //クラスはpublicだけどコンストラクタはprivate
  }

  private void hoge(){
    new Inner();
  }
}

コンパイル:
Outer.class
Outer$Inner.class
Outer$1.class
---------------------------------------------------

public class Outer {
  public class Inner{
    private Inner(){}
    private Inner(String arg){}
  }

  private void hoge(){
    new Inner();
    new Inner(""); //複数private コンストラクタを作っても変わらない
  }
}

コンパイル:
Outer.class
Outer$Inner.class
Outer$1.class

2015年11月19日木曜日

IO DataのUSB-RGB2 ドライバメモ

いままで、Mac Book Airを家で使う時はデュアル画面で作業していたのだけど、
つい、3画面にしたいなぁ・・・と思って調べてみると、

IO DataのUSB-RGB2を使えば解決しそうってことでさっそく買ってみたものの・・・
無反応(10.10 Yosemite)。

そこで、最新のドライバいれればなんとかなるだろ。
ってことで、
http://www.iodata.jp/lib/product/u/3361.htm

からダウンロードしてみたものの、これを入れても解決せず・・・


ネットを徘徊していたら、下記のドライバを入れたら解決!
って話があったので、
http://www.displaylink.com/support/mac_downloads.php



Version 2.4をダウンロードしていれてみる。

再起動を要求されるので、再起動。

そして、接続してみると無反応・・・
と、思ったところ、数秒したら表示してくれましたとさ。

2015年10月4日日曜日

nginxメモ

■インストール
Homebrewで入れました
$ brew install nginx

■コマンド
% nginx
% nginx -s stop
% nginx -s reload

■設定ファイル
max os x
/usr/local/etc/nginx/nginx.conf


読み解いてみる
--------------------------------------------------
#user nobody;
worker_processes 1;
--------------------------------------------------
・user
Nginxワーカプロセス実行時のユーザーアカウントとユーザーグループを指定可能
第一引数:ユーザーアカウント
第二引数:ユーザーグループ

・worker_processes
ワーカー数を複数指定することで、処理を分散させることができる。
CPUのコア数に応じて増やすとよいらしい



--------------------------------------------------
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
--------------------------------------------------
・error_log
エラーログの出力。エラーレベルを分けて出力できる
第一引数:パス
第二引数:levelを指定。levelに応じてファイルを分けることが可能
debug, info, notice, warn, error, crit



--------------------------------------------------
#pid logs/nginx.pid;
--------------------------------------------------
・pid
pidファイルパス



--------------------------------------------------
events {
worker_connections 1024;
}
--------------------------------------------------
Eventsモジュール
・worker_connections
ワーカプロセスの同時接続数を指定



--------------------------------------------------
http {
include mime.types;
default_type application/octet-stream;
--------------------------------------------------
httpモジュール内
incledeでmimeタイプを読み込み
何が書かれているかは、下記を開いてみれば良いと思います
/usr/local/etc/nginx/mime.types
80行ほどいろいろ設定してありました

default_typeは、mime.typesの設定で解決できなかったとき何で解決するかという話ですね
application/octet-streamとなっていますね。



--------------------------------------------------
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';

#access_log logs/access.log main;
--------------------------------------------------
httpモジュール内
・log_format
ログの出力形式を指定 第一引数は、書式の名前

・access_log
アクセスログの出力設定
第一引数でファイルパス
第二引数で書式の名前


--------------------------------------------------
sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

#gzip on;
--------------------------------------------------
httpモジュール内
・sendfile
カーネルのsendfileを使うかどうか。使えないとnginx自身がファイル転送をする
第一引数 on/off

・tcp_nopush
ソケットオプションを有効/無効にする
sendfileが有効な時だけ適用される
第一引数 on/off

・keepalive_timeout
キープアライブを切るための待ち時間
第一引数 秒数

・gzip
コンテンツを圧縮するかどうかの設定
第一引数 on/off



--------------------------------------------------
server {
listen 8080;
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;
--------------------------------------------------
httpモジュール内 > serverモジュール内
サーバーの設定を行うモジュール

・listen
リクエストを受け付ける設定

listen [address] [:port] [additional options];
addressを省略すると全てのアドレス
portは省略すると80番

・server_name
ホスト名の設定
server_name host1 [host2…]

server_name www.example.com;
server_name www.example.com example.com;
server_name *.example.com;
などなど



--------------------------------------------------
location / {
root html;
index index.html index.htm;
}
--------------------------------------------------
httpモジュール > serverモジュール > locationモジュール
・root
ドキュメントのルートを指定する

・index
指定されなかったときのデフォルトのページを指定
ここでは、省略されているときは、index.html, index.htmを探す


--------------------------------------------------
#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
--------------------------------------------------
httpモジュール > serverモジュール
・error_page
エラーページの設定
error_page code1 [code2…] [=replacement code] [=@block | URI]

例)
error_page 404 /not_found.html
error_page 500 501 502 503 504 /server_error.html
error_page 403 http://www.example.com/;
error_page 404 =200 /index.html; #404エラーは200を返しindex.htmlを開く 存在しないパスに飛んだら特定のページに返すみたいなことね


ひとまずここまで、また何かあれば追加する

2015年7月12日日曜日

Android Studio インストールメモ

OS X(10.9.5)に入れようとして例の場所で苦労したのでメモ。
結局なぜ入ったのか不明ですが・・・

まずはダウンロード
https://developer.android.com/sdk/index.html

DOWNLOAD ANDROID STUDIO FOR MACをクリック
ダウンロード完了するの待ちます。


ダウンロード完了したら、ファイル(android-studio-ide-141.1980579-mac.dmg)をクリック
ドラッグ&ドロップでApplicationフォルダにコピーします。


ApplicationにあるAndroid Studio.appを実行します。
開くを選択


以前の設定をimportするか聞かれるのですが、初めてなので I do not have a~を選択


Nextを選択


インストールタイプはStandardでNext


ライセンス同意のページですね。
android-sdk-licenseとintel-android-extra-licenseのそれぞれをクリックして
Acceptを選択します。するとFinishが選択できるようになるので選択

さて、ここからが戦いの始まりです。
Cancel/Retryの画面が出て先に進めなく成ります

The following SDK components were not installed: sys-img-x86-addon-google_apis-google-22 and addon-google_apis-google-22

ネットで調べてみるとGoogle APIs, Android 22が鬼門となっている話をちらほら見かけます。
解決方法として見かけたのは
・Android Studioの環境設定で Appearance & Behavior→System Settings→HTTP ProxyでAuto-detect proxy setttings
を選択するというもの。これはプロキシ設定のある環境にてインストール使用としている場合これが有効という話が・・・
→該当しないものの、念のためためすだけためしてみたものの自分には関係ないっすね。

・コンソール画面で、cd /Applications/Android\ Studio.app/Contents/MacOS
sudo studio で起動するというもの。これは最初っから権限のある状態でインストールすればいけたという話。
→やってみたものの何も影響無し

・Instrall TypeをStandardではなくCustomでやるとインストールできる説
 
Android SDK Platform, API 22 を共にチェックしてさて 次の画面へ・・・
と思っても

An existing Android SDK was detected. と怒られるわけで・・・


あきらめてもう一回Standardを選択して実行したら普通にインストールできました。。。
というお話。