ねっとぱんだ-プログラミング勉強ブログ-

Webデザイン、プログラミングの勉強ブログ。

【java】配列、データ型とメモリ、メソッド

配列の宣言

//型を宣言した後に変数名
	  int[] sales;
//配列の長さ
	  sales = new int[3];
//代入
	  sales[0] = 100;
	  sales[1] = 200;
	  sales[2] = 300;
//代入を省略、長さは宣言しなくていい
	  int[] sales;
	  sales = new int[]{100,200,300};
//初期化を省略  
	  int[] sales = {100,200,300};
      
	  System.out.println(sales[1]);
//for文での書き出し
	  int[] sales = {100,200,300};
	  
	  for(int i = 0; i < sales.length; i++){  
	    System.out.println(sales[i]);
      }
//for文の省略した書き方
      //salesの値を一つずつsaleに代入している
	  for(int sale : sales){  
	    System.out.println(sale);
      }

データ型、参照型とメモリ

データ型

メモリに値そのものが入る

//変数を宣言するとメモリに格納される
int i
//値を入れるとメモリ内に値が格納される
i = 10;

参照型

メモリに値が格納されたメモリの番地?が入る

//この時点で配列の長さはわからない
//配列に入るデータの番地を格納できる領域が作られる。
int[] a;
//それぞれの値がそれぞれのメモリに格納される。
a = new int[] {1,2,3};
//その後、宣言時のメモリにデータが入ったメモリの先頭の番地が格納される。

配列に格納していった場合

      int[] a = {3,4,5};
      //この時点で配列bには配列aの値の「番地」が格納される。
      int[] b = a;
      //b[1]はa[1]でもある為、両方の配列の値が変わる
      b[1] = 8;
      //同じ値が書き出される。
      System.out.println(a[1]);
      System.out.println(b[1]);

文字列の場合

文字列は参照型であるが、データ型を同じ挙動をするように調整されている。
文字列は変更が不可になっているので
違うデータを代入すると別の領域に割り当てられる。

      String s = "hello";
      String t = s;
      //新しいメモリが割り当てられる。
      t = "world";
      System.out.println(t);
      System.out.println(s);

メソッド

	public static void sayHi(String name){
	      System.out.println(name);
	}
	
   public static void main(String[] args){
          sayHi("bob");
    }
    //メソッドで値を返すときはvoidに型を記述
    //void  = 何もないという意味
    public static String sayHi(String name){
	      return "Hi!" + name;
	}
	
    public static void main(String[] args){
          String msg = sayHi("taro");
          System.out.println(msg);
    }

メソッド内で宣言した変数はメソッド内のみで有効。

オーバーロード

引数の数や型が違う場合、同じ名前でメソッドを作れる

	public static void sayHi(String name){
	      System.out.println(name);
	}
	
	public static void sayHi(){
	      System.out.println("none");
	}

	
    public static void main(String[] args){
          sayHi("bob");
          sayHi();
    }

【node.js】macへのインストールと概要

node.jsとは

サーバーサイドのJavaScript
JavaScript アプリケーションのプラットフォーム

ノンブロッキングI/O
I/Oの結果を待たないで処理をすすめる。 I:O=入出力

C10K問題 (クライアント1万台接続問題)を解決

C10K問題
1万接続でパフォーマンスが落ちない

http://qiita.com/hshimo/items/1ecb7ed1b567aacbe559

node.jsインストー

下記手順でhomebrewを使ってインストールします。
http://qiita.com/akakuro43/items/600e7e4695588ab2958d
下記のエラーが出たので検索

/Users/sk/.nodebrew/src/v8.2.1/node-v8.2.1-darwin-x64.tar.gz: No such file or directory

ファイルがない為だったのでファイルを作成するとうまくいきました。
https://blog.yug1224.com/archives/5693a5e0fef2539c7d5b149d

実行パスを通す段階で僕も引っかかりました。
$nodebrew list でインストールしたnode.jsを確認後、
$nodebrew use v8.2.1 で指定したのに
$node -v でバージョン確認ができませんでした。

下記サイトによると.bashrcは自動で読み込まれないらしい
http://kinacom.hatenablog.jp/entry/2015/05/28/180523
https://gist.github.com/shokuto/4576386

上記参考サイトと同じように.bash_profileファイルを作って
以下を記述して再起動するとバージョンが確認できました

if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi

.bashとか.bash_profilrの記述はシェルスクリプト

シェルスクリプト
オペレーティングシステムのシェルまたはコマンドラインインタプリタ向けに書かれたスクリプト

シェルスクリプトとは、簡単に言うとUnixコマンドなどを並んで実行するだけ」
http://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337
http://shellscript.sunone.me/tutorial.html#シェルスクリプトとは

node.jsの実行方法

1.コマンドラインにnodeと打って記述

mbp:~ sk$ node
> console.log("helloworld");
helloworld //表示される
undefined
> 
  • node.jsはブラウザを使わないのでDOMの操作はできない。
  • .help で使えるコマンド一覧が表示

2.jsファイルを作り実行
javascriptなのでjsファイルを作る

node hello.js

nonbrockingな書き方

次の処理をブロックしないように書く

例)helloの1秒後にworldを記述

setTimeout(function(){
  console.log("hello");
},1000);
console.log(world);

brockしてしまう書き方
1秒立つまでのループ
ループが終わるまで後ろの処理をブロックしてしまう。

var start = new Date().getTime();
while (new Date().getTime() < start + 1000);
console.log("hi");

【Linux】cui切り替え・webサーバー構築の準備・IPについて


linuxを触って見ています。
先日から参考サイト(http://ufuso.jp/wp/?p=15122)を見てwebサーバーやftpサーバー構築を試みましたが
まだ理解不足なところが多かったので基礎知識からやっていきます。

guiからcuiに切り替える

サーバー用途においてguiは無駄なメモリを消費する。

CentOS 7の場合

systemctl でデフォルトのモードを変更する

systemctl set-default multi-user.target

その他のsystemctlコマンド
http://www.atmarkit.co.jp/ait/articles/1603/25/news026.html

参考:https://ameblo.jp/yukisku/entry-11964626547.html

再起動後、
localhost login:にroot
Passwordに設定したpasswordをいれてログイン

ディスプレイマネージャとは?

https://eng-entrance.com/linux-displaymanager

  • LinuxでのGUI環境(といっていい)
  • X Window System(Xディスプレイマネージャ)上のプログラムの一つ
    GUIでのログインが可能になる

webサーバー構築の準備

Apacheのインストー

yumとは
Yum(Yellowdog Updater Modified/ ヤム)
LinuxRedHatディストリビューションCentOSFedoraなど)で利用されるパッケージ管理ツール。
DebianディストリビューションUbuntuなど)で利用される「APT」に相当
パッケージの集合体であるリポジトリーと連動
リポジトリー repository
ソースコードや設計、データの仕様といった情報が保管されているデータベース

RedHatディストリビューションでは、rpm形式(.rpm)が使われている。(同じ名前のパッケージ管理ツール「RPMRPM Package Manager)」もある)

yumの仕組み

ネットワーク越しにアクセス出来るサーバからパッケージをインストールできる。リポジトリはメディア上にも置ける。
http://q.hatena.ne.jp/1315885174

yumapacheをインストー

//yumを指定
//-y:問い合わせに全てyと答える
//install:インストール
//httpd:apacheを指定
yum -y install httpd
httpd
常駐プログラム(デーモン)のひとつ。
Webサーバとして仕事をしているデーモン
http://wa3.i-3-i.info/word13579.html
デーモン
LinuxUNIXにおいてメモリ上に常駐して様々なサービスを提供するプロセス
悪魔の「demon」ではなく守護神の「daemon
プログラムファイル名(プロセス名)の最後に「d」が付けられていたりする。
https://begi.net/read/base/13.html


http://qiita.com/sango/items/a86f9b8cf8c9c641823a

linuxコマンド yum
yum [option] [command] [package]

http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/230999/

ipについて

グローバルIPアドレス
広大なインターネットにおける自分の住所を表す。IPアドレスは同時に他に存在しない。
プライベート(ローカル)IPアドレス
ルーターが割り振るアドレス。プライベートIPアドレスを使ってインターネット(グローバルネット)に接続することはできない。

プライベートIPアドレスは192.168.0.0~192.168.255.255の間になる
プライベートIPアドレスとは パソコン初心者講座

デフォルトゲートウェイ
外部にあるネットワークに通信を行う場合の出入り口の役割を果たすように設定されたルータやコンピュータのこと
LAN(Local Area Network)
施設内程度の規模で用いられるコンピュータネットワーク。回線契約者(ネットワーク管理者)が許可したパソコンやインターネット接続機器しか接続できない。
WAN(Wide Area Network)
広い範囲(市街地を越え郊外、県外や国際の範囲)におよぶネットワーク。だれもが自由に接続できる。WAN側のIPアドレスISP(Internet Services Provider)に利用申請等をしなければならない。
NAT
NATがLAN内の端末プライベートIPアドレスをNATに割り当てられているグローバルIPアドレスに変換してからWANに接続される。
NATがWAN側からLAN側への通信をブロックする(ファイアウォールとは違いあくまでIPアドレスの変換装置)ことによってNATのLAN側はプライベートIPアドレスを使うことができる。

端末(プライベートIPアドレス)-LAN--NAT(グローバルIPアドレス)-WAN-インターネット

NAPT
NATと違い、IPアドレスだけでなくポート番号まで変換する。

NAT、NAT超えについて
[NAT]NAT越え入門1-NATとは何か?: Tomo’s HotLine

ルーターのWAN側にはグローバルIPアドレスが、LAN側には(基本的に)プライベートIPアドレスが割り振られている。

ネットワーク講座
3 Minutes Networking

IPv4
「0.0.0.0」から「255.255.255.255」までの約43億(4,294,967,296個)のアドレス
IPv6
約340澗のアドレス 澗=10の36乗

http://www.atmarkit.co.jp/ait/articles/0109/29/news004.html

サブネットマスク
IPv4IPアドレスを使用している場合のみに使用。ネットワークの範囲(サブネット)を指定。ネットワーク管理で変更することはありますが、一般的に使う場合は まず変更することはまずない。
https://www.cman.jp/network/term/subnet/
lo
ローカルループバック。仮想的にネットワークのテストなどに使えるように用意されている。必ず127.0.0.1が割り当てられる。外部と通信はできない。
ens〇〇
en=イーサネット(Ethernet) s=スロット 〇〇=数字
Ethernet
LAN(ローカルエリア・ネットワーク)で最も使用されている技術規格。LAN で接続された多数のコンピュータが、 効率よく通信回線を利用できるように考えられた通信方法の一つ。

http://www.infonet.co.jp/ueyama/ip/network/ethernet.html

ネットワークインタフェース
ネットワークの機能を使うための電気的/ソフトウェア的な呼び出し方法などの仕様
broadcast
ネットワーク内のすべての端末にデータを送信するために使われるアドレス。
virbr0
KVM環境を構築した際、初期状態で存在する仮想ブリッジ
KVM (Kernel-based Virtual Machine)
Linux Kernel自体をハイパーバイザ(仮想機械を実現するための制御プログラム)とする仕組み
MACアドレス (Media Access Control address)
ネットワーク上で、各ノードを識別するために設定されているLANカードなどのネットワーク機器のハードウェアに(原則として)一意に割り当てられる物理アドレス。LAN(ネットワークセグメント)内の宛先特定のために使われる。
6つの16進数で区切られる。
http://www.mm-labo.com/computer/tcpip/ipaddress/ipaddressandmacaddress.html

centos7でip確認

コマンドでグローバルIPを呼び出す

$ curl ifconfig.io

http://qiita.com/kanpou_/items/734b947f5a95109e7bb9

IPを確認(a = adress)

ip a

iconfigはデフォルトではなくipになった。
http://qiita.com/Bopllq0916/items/17a9514dcd2711806479

詳しく確認(d = device)

$ nmcli d show

http://neoblog.itniti.net/centos7-check-ipaddress/

【WordPress】クライアントワークCMS化2 カスタム投稿 / カスタムフィールド追加

WordPressへのカスタム投稿タイプ、カスタムフィールドの追加

やった事
Custom Post Type UIとAdvanced Custom Fieldを使用してのカスタム投稿タイプ、カスタムフィールドの追加
Custom Post Type UI
カスタム投稿フィールドをfunctions.phpに自分で記述せずに作成できる。
Advanced Custom Field
投稿フォームを任意の形式で作成できる。

チェックボックスやテキストエリアの他にラジオボタン、メールなどHTML5で使用できるフォームやカラーピッカーなどが作成できる。
f:id:p_and_a_fam:20170720013157p:plain

Advanced Custom Fieldのフォームから入力した値を書き出す

通常の書き出しかたとは違い、専用の関数を使う

//値を取得
get_field('フィールドに設定した名前');
//値を書き出す(この関数のみで書き出し可能)
the_field('フィールドに設定した名前');

get_field()を変数に代入してechoで書き出す方法も見ましたがチェックボックスなどは配列として書き出されてしまいます。
the_field('フィールドに設定した名前')を使用した場合は選択した値だけ書き出されました。

Advanced Custom Fieldの関数まとめ
https://blog.s-giken.net/255.html

参考
http://moneyreport.hatenablog.com/entry/wordpress_custom_fieldhttp://oxynotes.com/?p=1339

【Linux】CentOSのインストール

CentOS7をWindowsにインストールする

やること

貰い物のWindowslinuxcentosを入れて勉強しようと思います。
もらいもののPCですが練習ということもあり仮想環境でやっていきます。

CentOSとは

Red Hat Enterprise Linuxという有料のディストリビューションのクローンでフリーのディストリビューション
企業のサーバや業務用デスクトップ環境の構築をターゲットとしている。

引用:https://ja.wikipedia.org/wiki/CentOS

  • コミュニティーベース
  • YUMRPMによるパッケージ管理
  • 長期間にわたるセキュリティーフィックスサポート
  • 少々枯れたパッケージを採用することで安定性を重視する
  • 基本的にサーバー業務に向いている

引用:https://eng-entrance.com/what-is-centos

インストー

下記参考サイトを元にインストールしていきました。
参考:https://nelog.jp/vmware-linux
上記のチュートリアルにはなかったのですが、
途中でsetup画面がでてきたので、上から順番に設定していき、右下の完了ボタンを押したあと、
チュートリアルと同じログイン画面へ
f:id:p_and_a_fam:20170717114516p:plain
f:id:p_and_a_fam:20170717114535p:plain
GUIのデスクトップ?が出てきた後言語選択画面へ

次回は一通りGUIを触ってみた後、CUIに切り替えて操作してみたいと思います。
http://blog.rutti.net/item_217.html#.WWwizNOLQ1g

【java】javaの学習について/型の宣言と変換

目標

javaの学習についてですがひとまず以下のようなチュートリアルGUIを作れることを目指したいと思います。
ゲーム制作
http://codezine.jp/article/detail/765?p=3
http://docs.oracle.com/cd/E26537_01/tutorial/uiswing/index.html

Javaが動く仕組み、基本的な記述

myapp.java
コンパイルする
mapp.class JRE(Java Runtime Environment)で動く

OS間をまたぐ際は、そのOS向けのJREをインストールすると.classのファイルを移すだけで実行できる。
「Write onece,run anywhere」

javaの記述方

まずクラスを作る。クラス名はファイル名と大文字小文字同じに。

public class hw0716{
	public static void main(String[] args){
		System.out.println("Hello World");
	}
}

コメントは//と/**/

Javaの変数

型を宣言、宣言と同時に代入できる

public class hw0716{
	
	public static void main(String[] args){
		//変数
		//型 変数名
		String msg;
		msg = "Hello,";
		//型 変数名
		String msg2 = "World";
		System.out.println(msg+msg2);
	}
	
}

それぞれの変数

public class hw0716{
	
	public static void main(String[] args){
		//文字 全部小文字 シングルクオテーション
		char a = 'a'; 
		//整数 byte short int long
		//右に行く解けたの大きい整数を扱う 通常ではint
		int x = 10;
		//longは最後にlをつける。(大文字の方がわかりやすい)
		long y = 3333333333L;
		//浮動少数点
		double d = 4535.453;
		float f = 54.22F;//最後にf
		//論理値
		boolean flag = true;
		boolean flag2 = false;
		//文字列で使える特殊文字
		// ¥n 改行
		// ¥t タブ
		System.out.println("aaaaa\naa\ta");
	}
	
}

整数型で宣言していると小数点は切り捨てられる。

int x = 10/3;
System.out.println(x);

文字列の連結は+

型の変換

double型をint型に代入はできない

double d = 4653.345;
int i = d;
//エラー文
//Type mismatch: cannot convert from double to int

明示的にする
他のデータ型に変換することを「キャストする」という

double d = 4653.345;
int i = (int)d;//小数点を切り捨てて表示される

データ変換時の注意

int i= 10;
double d = i/4;
//この時点で2.5ではなく、i/4の整数型の計算として結果は2.0になっている
System.out.println(d);
int i= 10;
double d = (double)i/4;
//iをdouble型にキャストすれば解決
System.out.println(d);

【php】アカウント登録、ログイン機能をクラス化してみる

アカウント登録、ログイン機能をクラス化

引き続き、チームラボさんの研修をやりました。

https://team-lab.github.io/skillup/2/4.htmll

研修の仕様なのか僕がヘボいからか、このまま写経すると渡された引数が使われてなかったりエラーになったりする記述だったので直しながらの制作でした。
同じ機能を別の書き方をすることにより前より理解が深まったと思います。

<?php
class Auth{
  //接続に必要な情報を定数化
  const HOST_NAME = "localhost";
  const USER_NAME = "root";
  const PASSWORD = "";
  const DATABASE_NAME = "login";
  
  private $mysql = null;
//オブジェクト作成時と共に呼び出される処理
  function __construct(){
    $this->mysqli = new mysqli(
      self::HOST_NAME,
      self::USER_NAME,
      self::PASSWORD,
      self::DATABASE_NAME
    );
    session_start();
  }
    
  //ユーザー登録ができたかどうか
  public function register($username,$password){
      //受け取ったパスワードをハッシュ化
      $password = password_hash($password,PASSWORD_DEFAULT);
      $stmt = $this->mysqli->prepare("INSERT INTO users VALUES(?,?)");
      $stmt->bind_param('ss',$username,$password);
      //実行後、結果が成功したかどうか返される
      return $stmt->execute();
  }
    
  public function login($username,$password){
    //クラス内のメソッドよびだしは$this->をつける
    $stmt = $this->mysqli->prepare(
      "SELECT password FROM users WHERE username = ?");
    $stmt->bind_param('s',$username);
    $stmt->execute();
    $stmt->store_result();
    if($stmt->num_rows == 1){
      $stmt->bind_result($hash);
      while ($stmt->fetch()){
        if(password_verify($_POST['password'],$hash)){
          $_SESSION['username'] = $_POST['username'];
          return true;
        }
      }
    }
    return false;
  }
  
  public function getUser(){
    if(isset($_SESSION['username'])){
      return $_SESSION['username'];
      return null;
    }
  }
  
  //ログアウトする
  public function logout(){
    $_SESSION = array();
    session_destroy();
  }
  }

ついでなので研修課題もやります↓。

[課題]オブジェクト指向について調べよう

オブジェクト指向のメリットやデメリットについて調べてみましょう。また、「継承」とは何かについて調べてみましょう。」

オブジェクト指向のメリット

  • プログラムをグループ化して分けると言う、プログラム作成の概念
  • プログラマムの簡潔さは、現れる
  • 以前に作ったグループを再利用することも可能
  • ある部品(クラス)と別の部品を組み合わせて、新たな機能も作れる
  • 「ある箇所を仕様変更したら、他の箇所に悪影響してしまった」と言うことが、比較的に少ない
  • 各プログラム部品の役割がきちんとわかるので、デバッグの面でも良い
  • ゲームでの利用でかなり便利

参考:https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1149572636

前にunityでC#に触れたときに記述した内容はオブジェクト指向だったんですね。

オブジェクト指向のデメリット

  • 組み込みではオブジェクト指向の採用があまり進んでいない
  • 必要なリソースが大きい。オブジェクト指向によるプログラムは、言語構造上メモリを贅沢に使う
  • 関数の数も多くなるため、オーバーヘッドによるロスが大きくなる。
  • オブジェクト指向のプログラムよりコードの量が増える
  • 従来のパラダイムより設計が難解
  • 設計で妥協するとリソースだけ浪費してオブジェクト指向のメリットが全く活かされないという事態を招く
  • オブジェクトそれぞれが独立して状態を持つためステップを追った解析が難しい
  • ライブラリ型の構造が不適
    低レイヤのプログラムは基本的に非オブジェクト指向言語。低レイヤ層との親和性が損なわれる

参考:http://goyoki.hatenablog.com/entry/20080114/1200325011