Quantcast
Channel: プログラム の個人的なメモ
Viewing all 860 articles
Browse latest View live

【Tomcat】Tomcatのセッション永続化 ~ セッション レプリケーション / DynamoDB編 ~

$
0
0

手順概要

[1] JDBCドライバを【Tomcat Home】/lib配下に格納
[2] Tomcatの設定を修正
 [2-1] context.xml
 [2-2] server.xml
 [2-3] catalina.properties
 [2-4] web.xml
[3] Tomcatを再起動する
[4] 動作確認

詳細手順

構築環境

 * OS     : Windows10
 * DB     : DynamoDB Local
 * Java   : JDK1.8
 * Tomcat : Apache Tomcat v8.5.11

前提条件

 * 「Tomcat」「Amazon DynamoDB Local」をインストールしておくこと

[0] 準備 : JDBCドライバのダウンロード

 * JDBCドライバをダウンロード(今回は「aws-dynamodb-session-tomcat-2.0.4.jar」)する
https://github.com/aws/aws-dynamodb-session-tomcat/releases

[1] JDBCドライバの設定

[1] [0]のJDBCドライバを【Tomcat Home】/lib配下に格納する

[2] Tomcatの設定を修正

[2-1] context.xml を修正する
~~~~
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
<!-- ★追加★ -->
<Manager className="com.amazonaws.services.dynamodb.sessionmanager.DynamoDBSessionManager"
      awsAccessKey="yourAccessKey"
      awsSecretKey="yourecretKey"
      endpoint="http://localhost:8000"
      table="tomcat_sessions"
      createIfNotExist="true"
      processExpiresFrequency="1"
/>
<!-- ★追加★ -->
</Context>
~~~~

[2-2] server.xml を修正する
~~~~
【修正前】
<Engine name="Catalina" defaultHost="localhost">

【修正後】
<Engine name="Catalina" defaultHost="localhost"
 jvmRoute="jvm1" backgroundProcessorDelay="1" startStopThreads="-1">
~~~~

[2-3] catalina.properties を修正する
~~~~
#tomcat.util.buf.StringCache.cacheSize=5000

#★追加★
org.apache.catalina.session.StandardSession.ACTIVITY_CHECK=true
~~~~

[2-4] 【Tomcat】/webapps/【自分プロジェクト】/WEB-INF/web.xml を修正する

「<distributable />」を追記
~~~~
  ・・・略・・・
  <distributable />
</web-app>
~~~~

[3] Tomcatを再起動する

systemctl restart tomcat

[4] 動作確認

[1] 以下の関連記事の「【動作確認用サイト】sessionExam.jsp」を
   「/usr/local/tomcat/webapps/examples」配下に置く
http://blogs.yahoo.co.jp/dk521123/36708242.html
[2] ブラウザのURL欄に以下のURLを入れる
[[http://localhost/examples/sessionExam.jsp]]
[3] DB内のテーブル「tomcat_sessions」をみてみる
 => データが確認できることを確認する


関連記事

Amazon DynamoDB Local

http://blogs.yahoo.co.jp/dk521123/36725347.html

Tomcatのセッション永続化 ~ セッション レプリケーション / MySQL編 ~

http://blogs.yahoo.co.jp/dk521123/36698011.html

【Nginx】【Tomcat】SSLで、Amazon ELB - Nginx - Tomcat を連携する

$
0
0

環境 / 構成

URL : https://www.example.com/SampleWebService/
 * Client
   |
  HTTPS
   ↓
 * ELB(ロードバランサ)
   |
  HTTP
   ↓
 * Nginx 
   |
  HTTP
   ↓
 * Tomcat (v8.5.11)
   ↓
 * Webサービス

前提

 * ELB の設定は行っていること
 * Nginx、Tomcat のインストールはしてあること
Nginx
http://blogs.yahoo.co.jp/dk521123/36721709.html
Tomcat
http://blogs.yahoo.co.jp/dk521123/36706185.html

設定

Nginx / default.conf

sudo vi /etc/nginx/conf.d/default.conf
server {
    # ・・・略・・・

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    # ★追加★
    location /SampleWebService/ {
        proxy_http_version 1.1;
        proxy_pass http://localhost:8080/SampleWebService/;
    }

    # ・・・略・・・
}

Tomcat / server.xml

sudo vi /usr/local/tomcat/conf/server.xml
<!-- Comment Out
<Connector port="8080" protocol="HTTP/1.1"
      connectionTimeout="20000"
      redirectPort="8443" />
-->

<Connector port="8080" protocol="HTTP/1.1"
    proxyPort="443"
    scheme="https"
    secure="true"
    proxyName="www.example.com"
    URIEncoding="UTF-8"
    connectionTimeout="20000"
    redirectPort="8443" />


関連記事

【Apache】【Tomcat】 「A cookie header was received [XXX=YYY] that contained an invalid cookie」が表示される

http://blogs.yahoo.co.jp/dk521123/36721868.html

Nginx ~ 入門編 / Linux版 ~

http://blogs.yahoo.co.jp/dk521123/36721709.html

【Linux】【Tomcat】Tomcat 8.5 のインストール

http://blogs.yahoo.co.jp/dk521123/36706185.html

【AWS】IAM (Identity and Access Management)

$
0
0

はじめに

http://blogs.yahoo.co.jp/dk521123/36716365.html
でやったが、Amazon DynamoDB で
アクセスキー IDと、シークレットアクセスキーを取得する必要があるが
IAMって単語が出てきたので、調べてみた

IAM

http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/introduction.html
 * Identity and Access Management
 * ユーザーに対して AWS へのアクセスを安全に制御するための仕組み


【AWS】ALB を使った パスベースのルーティング

$
0
0

はじめに

http://blogs.yahoo.co.jp/dk521123/36713623.html
で少し触れたが、CLB (Classic Load Balancer)ではできなかった
ALB (Application Load Balancer)でパスベースのルーティングを
行う必要があったので、記録しておく

パスベース(Path base)のルーティングとは?

例えば、以下のようなことを実現する
~~~~~
 http://www.example.com/SampleService/
   => Tomcat(Port:8080)に振り分ける

 http://www.example.com/
   => Nginx(Port:80)に振り分ける
~~~~~

手順

上記「パスベース(Path base)のルーティングとは?」の例の構成を構築してみる

前提条件

 * 「http://www.example.com/」のポート80の設定はすでに行っているものとして手順を作成する

手順

[1] ターゲットグループを作成する

~~~~~~
ポート:8080

ヘルスチェックの設定
パス:/SampleService/ (※1)

※1
ヘルスチェックをさせるファイルを直接していてもいい
例: /SampleService/HealthCheck.html
~~~~~~

[2] [ロードバランサー]-[リスナー]で「HTTP」欄を展開し、
    「ルールを追加する」を押下
~~~~~~
パスパターン : /SampleService/*


~~~~~~


関連記事

AWS(Amazon Web Services) ~ 入門編 / ELB作成 ~

http://blogs.yahoo.co.jp/dk521123/36713623.html

【Linux】【Tomcat】 単一Tomcat で複数のインスタンスを動かす ~その2~

$
0
0

■ はじめに

http://blogs.yahoo.co.jp/dk521123/36706243.html
で、Tomcatを複数インスタンス起動できるように構築する手順を記したが
CATALINA_HOME、CATALINA_BASE を理解した上で構築すると
無駄なファイルなく、構築できるので、メモしておく

補足

 * Ubuntuの場合は、tomcatX-instance-create コマンドで簡単にできるらしい

■ 関連する環境変数

CATALINA_HOME

 * Tomcat の実行に必要なファイル(bin/lib)のディレクトリ

CATALINA_BASE

 * Tomcat のインスタンスのディレクトリ
 * 定義するCATALINA_BASEディレクトリ配下には、以下のディレクトリが必要
~~~~~~
 + conf
 + temp
 + webapps
 + work
 + logs
~~~~~~

■ 構築環境

 * OS : CentOS7
 * Java : JDK1.8
 * Tomcat : Tomcat 8.5.11

ディレクトリ構成

/usr
 + local
    + tomcat       <= CATALINA_HOME
       + bin
       + lib
       + instance1 <= CATALINA_BASE 1
          + conf
          + temp
          + webapps
          + work
          + logs
       + instance2 <= CATALINA_BASE 2
          + conf
          + temp
          + webapps
          + work
          + logs

構築手順

前提条件

 * JDKはインストールされているものとする

[1] ダウンロード/インストール

[1-1] 以下のサイトからTomcatをダウンロードする(今回は「apache-tomcat-8.5.11.tar.gz」)
http://tomcat.apache.org/download-80.cgi
[1-2] 手順[1-1]を解凍し、インストールする

tar -xzvf ~/apache-tomcat-8.5.11.tar.gz
sudo mv ~/apache-tomcat-8.5.11 /usr/local/tomcat

[1-3] (ひとまず)Tomcatを開始する
~~~~
sudo /usr/local/tomcat/bin/startup.sh
~~~~

【出力結果】
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.

[1-4] 以下のコマンドでHTMLが表示されたらOK
     (GUIであれば、ブラウザで「http://localhost:8080」アクセスするでもOK)
~~~~
curl http://localhost:8080

# 問題なければ停止
sudo /usr/local/tomcat/bin/shutdown.sh
~~~~

[2] ディレクトリの配置と設定の変更

[2-1] 上記「 ディレクトリ構成」に合うようにディレクトリを配置する
~~~~
sudo mkdir /usr/local/tomcat/instance1

sudo mv /usr/local/tomcat/conf /usr/local/tomcat/instance1/conf
sudo mv /usr/local/tomcat/temp /usr/local/tomcat/instance1/temp
sudo mv /usr/local/tomcat/webapps /usr/local/tomcat/instance1/webapps
sudo mv /usr/local/tomcat/work /usr/local/tomcat/instance1/work
sudo mv /usr/local/tomcat/logs /usr/local/tomcat/instance1/logs

sudo cp -R /usr/local/tomcat/instance1 /usr/local/tomcat/instance2
~~~~

[3] サービス作成および自動起動登録

[3-1] Tomcat を動かすための専用ユーザ tomcat を追加
~~~~
# ユーザ作成
sudo useradd -s /sbin/nologin tomcat

# 所有者変更
sudo chown -R tomcat:tomcat /usr/local/tomcat
~~~~

[3-2] 以下のコマンドで、【tomcat_instance1.service】の内容を保存し、権限付与する
~~~~
sudo vi /etc/systemd/system/tomcat_instance1.service
sudo chmod 755 /etc/systemd/system/tomcat_instance1.service
~~~~

~【tomcat_instance1.service】~~~
[Unit]
Description=Apache Tomcat 8
After=network.target

[Service]
# !!
Environment="CATALINA_HOME=/usr/local/tomcat"
Environment="CATALINA_BASE=/usr/local/tomcat/instance1"

User=tomcat
Group=tomcat
Type=oneshot
PIDFile=/usr/local/tomcat/tomcat.pid
RemainAfterExit=yes
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
ExecReStart=/usr/local/tomcat/bin/shutdown.sh;/usr/local/tomcat/bin/startup.sh

[Install]
WantedBy=multi-user.target
~~~~~~~~~~~~

[3-3] 以下のコマンドで、自動起動登録
~~~~~~~~~~~~
systemctl enable tomcat_instance1

# 確認(「enabled」が表示されたらOK)
systemctl is-enabled tomcat_instance1
~~~~~~~~~~~~

[3-4] 以下のコマンドで、開始・停止できるか確認する
~~~~~~~~~~~~
# 開始
systemctl start tomcat_instance1

# 停止
systemctl stop tomcat_instance1
~~~~~~~~~~~~


関連記事

【Linux】【Tomcat】Tomcat 8.5 のインストール

http://blogs.yahoo.co.jp/dk521123/36706185.html

【Windows】【Tomcat】 単一Tomcat で複数のインスタンスを動かす

http://blogs.yahoo.co.jp/dk521123/33610584.html

【Linux】【Tomcat】 単一Tomcat で複数のインスタンスを動かす ~その1~

http://blogs.yahoo.co.jp/dk521123/36706243.html

【Nginx】【Linux】 Nginx ~ 基本編 / ロードバランシング ~

$
0
0

Nginx のロードバランシング方式

`方式`備考
`#
`意味
1 ラウンドロビン 処理要求を順番に割り振る デフォルト 2 Least Connected 接続数が少ないサーバに割り振る 「least_conn」で指定 3 IPハッシュ 同じアドレスからのリクエストは同じサーバに割り振る 「ip-hash」で指定

その他オプション

 * 重み付け

構文

* upstreamディレクティブを使う
http {
  upstream backend {
    ip_hash;
    server 127.0.0.1:8080 weight=3;
    server 127.0.0.1:18080;
  }
 
  # ・・・略・・・
}


関連記事

【Nginx】【Linux】 Nginx ~ 入門編 / 環境構築 ~

http://blogs.yahoo.co.jp/dk521123/36721709.html

【AWS】オートスケーリング ~ Auto Scaling ~

$
0
0

■ 用語整理

 * 一般的なものとして用語を整理する。
 * 一般的な用語なら、「インスタンス」⇒「仮想マシン/サーバー」と読み替えればいい。

スケールイン / スケールアウト

スケールイン
 * システムを構成するインスタンスを減らすこと
http://docs.aws.amazon.com/ja_jp/autoscaling/latest/userguide/AutoScalingGroupLifecycle.html#as-lifecycle-scale-in
スケールアウト
 * システムを構成するインスタンスを増やすこと
http://docs.aws.amazon.com/ja_jp/autoscaling/latest/userguide/AutoScalingGroupLifecycle.html#as-lifecycle-scale-out

スケールダウン / スケールアップ

スケールダウン
 * システムを構成するインスタンスのグレードを減らすこと
スケールアップ
 * システムを構成するインスタンスのグレードをあげること

オートスケーリング

オートスケーリング(Auto Scaling)
http://docs.aws.amazon.com/ja_jp/autoscaling/latest/userguide/WhatIsAutoScaling.html
 * 負荷に合わせて インスタンス数を自動的にスケールイン/スケールアウトする機能


関連記事

AWS(Amazon Web Services) ~ 入門編 / ELB作成 ~

http://blogs.yahoo.co.jp/dk521123/36713623.html

【AWS】ALB を使った パスベースのルーティング

http://blogs.yahoo.co.jp/dk521123/36733918.html

【Java】 スレッドダンプ

$
0
0

スレッドダンプ とは?

 * 全スレッドのスタックトレース

取得するタイミング

[1] プログラムが遅い、フリーズした場合
[2] クラッシュした場合

スレッドダンプ取得方法

概要

[1] JavaのプロセスIDを確認
[2] jstackコマンド等でスレッドダンプを取得

詳細

[1] JavaのプロセスIDを確認
# JPSコマンド
jps

# Linuxの場合
ps aux | grep java
[2] jstackコマンド等でスレッドダンプを取得
jstack 【プロセスID】 > threaddump.txt

kill -3 【プロセスID】

スレッドダンプを取得する際の注意点

[1] 一定の間隔で スレッドダンプを複数取得する(例:10 秒ごとに 1 つのスレッドダンプ)
 Case A : 全スレッドの状態遷移がない => ハング
 Case B : スレッド処理が進んでいる => 遅い

スレッドの状態

java.lang.Thread.State: WAITING (on object monitor)
                        ~~~~~~~
みたいな形で、スレッドの状態がわかる
`状態`備考
`#
`意味
1 RUNNABLE 実行中(正常) 2 WAITING 無期限で待機 3 TIMED_WAITING 指定された待機時間で待機 4 BLOCKED ブロック状態 この周辺をまず調査すべき 5 TERMINATED 終了

参考文献

http://qiita.com/strsk/items/f8cbed179dd934b0a31d
https://helpx.adobe.com/jp/experience-manager/kb/TakeThreadDump.html
http://qiita.com/strsk/items/f8cbed179dd934b0a31d
http://etc9.hatenablog.com/entry/2015/10/11/032336
http://d.hatena.ne.jp/yohei-a/20150101/1420112104
http://www.techscore.com/blog/2016/02/05/%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%83%80%E3%83%B3%E3%83%97%E3%81%A7%E3%83%9C%E3%83%88%E3%83%AB%E3%83%8D%E3%83%83%E3%82%AF%E3%82%92%E8%AA%BF%E6%9F%BB%E3%81%97%E3%82%88%E3%81%86/

【分散リポジトリ】【HG】【Linux】 Mercurial(HG) ~ タグ / ブックマーク編~

【AWS】AWS(Amazon Web Services) ~ 入門編 / S3 ~

$
0
0

はじめに

http://blogs.yahoo.co.jp/dk521123/36739695.html
で、Auto Scaling を行うと、EC2インスタンス自体がなくなってしまい
ログが回収できなくなるとのことなので、何かいい方法はないかと探してたら
以下のサイトが見つかった。で、その前段として、S3について調べる。
EC2インスタンス停止/終了時にログなどをS3に保存(CentOS 6.2)
http://blog.suz-lab.com/2012/04/ec2s3centos-62.html

Amazon S3

 * Amazon Simple Storage Service (S3)
 * 容量に関係なくデータを格納および取得できる

動画

 * まずは、以下のサイトを一見してみた方がいい
http://dotinstall.com/lessons/basic_aws/9515
http://dotinstall.com/lessons/basic_aws/9516

用語

バケット(Bucket)

 * 保存場所(フォルダみたいな感じ)
 * バケット名はグローバルでユニークである必要がある


今後参考になりそうなサイト

EC2インスタンスのログをログ収集サーバに集約しS3に保存する
http://qiita.com/MrMN/items/2b382d9e6f3a4f4f54fc
CDP:Web Storage Archiveパターン
http://aws.clouddesignpattern.org/index.php/CDP:Web_Storage_Archive%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3#cite_note-1

【AWS】AWSクラウドデザインパターン (CDP)

$
0
0

AWSクラウドデザインパターン

 * クラウドデザインパターン (Cloud Design Pattern; CDP)

CDP

http://aws.clouddesignpattern.org/index.php/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8#AWS_Cloud_Design_Pattern_.28CDP.29.E4.B8.80.E8.A6.A7
より

基本のパターン

 * Snapshotパターン(データのバックアップ)
 * Stampパターン(サーバの複製)
 * Scale Upパターン(動的なサーバのスペックアップ/ダウン)
 * Scale Outパターン(サーバ数の動的増減)
 * Ondemand Diskパターン(動的なディスク容量の増減)

可用性を向上するパターン

 * Multi-Serverパターン(サーバの冗長化)
 * Multi-Datacenterパターン(データセンターレベルの冗長化)
 * Floating IPパターン(IPアドレスの動的な移動)
 * Deep Health Checkパターン(システムのヘルスチェック)
 * Routing-Based HAパターン(ルーティングによる接続先の透過的な切り替え)

動的コンテンツを処理するパターン

 * Clone Serverパターン(サーバのクローン)
 * NFS Sharingパターン(共有コンテンツの利用)
 * NFS Replicaパターン(共有コンテンツの複製)
 * State Sharingパターン(ステート情報の共有)
 * URL Rewritingパターン(静的コンテンツの退避)
 * Rewrite Proxyパターン(URL書き換えプロキシの設置)
 * Cache Proxyパターン(キャッシュの設置)

Scheduled Scale Outパターン(サーバ数のスケジュールにあわせた増減)

 * IP Poolingパターン(接続許可済みIPアドレスのプール)
 * 静的コンテンツを処理するパターン
 * Web Storageパターン(可用性の高いインターネットストレージ活用)
 * Direct Hostingパターン(インターネットストレージで直接ホスティング)
 * Private Distributionパターン(特定ユーザへのデータ配布)
 * Cache Distributionパターン(ユーザに物理的に近い位置へのデータ配置)
 * Rename Distributionパターン(変更遅延のない配信)
 * Private Cache Distributionパターン(CDNを用いたプライベート配信)
 * Latency Based Origin(地域によりオリジンサーバを変更)

データをアップロードするパターン

 * Write Proxyパターン(インターネットストレージへの高速アップロード)
 * Storage Indexパターン(インターネットストレージの効率化)
 * Direct Object Uploadパターン(アップロード手順の簡略化)
 * リレーショナルデータベースのパターン
 * DB Replicationパターン(オンラインDBの複製)
 * Read Replicaパターン(読込専用レプリカによる負荷分散)
 * Inmemory DB Cacheパターン(頻度の高いデータのキャッシュ化)
 * Sharding Writeパターン(書き込みの効率化)

非同期処理/バッチ処理のパターン

 * Queuing Chainパターン(システムの疎結合化)
 * Priority Queueパターン(優先順位の変更)
 * Job Observerパターン(ジョブの監視とサーバの追加・削除)
 * Fanoutパターン(複数種類の処理を非同期かつ並列に実行)

運用保守のパターン

 * Bootstrapパターン(起動設定の自動取得)
 * Cloud DIパターン(変更が多い部分の外出し)
 * Stack Deploymentパターン(サーバ群立ち上げのテンプレート化)
 * Server Swappingパターン(サーバの移行)
 * Monitoring Integrationパターン(モニタリングツールの一元化)
 * Weighted Transitionパターン(重みづけラウンドロビンDNSを使った移行)
 * Log Aggregation パターン(ログの集約)
 * Ondemand Activationパターン(メンテナンス時の一時的な設定変更)

ネットワークのパターン

 * Backnetパターン(管理用ネットワークの設置)
 * Functional Firewallパターン(階層的アクセス制限)
 * Operational Firewallパターン(機能別アクセス制限)
 * Multi Load Balancerパターン(複数ロードバランサの設置)
 * WAF Proxyパターン(高価なWeb Application Firewallの効率的な活用)
 * CloudHubパターン(VPN拠点の設置)
 * Sorry Pageパターン(バックアップサイトへの自動切り替え)
 * Self Registrationパターン(自分の情報をデータベースに自動登録)
 * RDP Proxyパターン(Windowsインスタンスへのセキュアなアクセス)
 * Floating Gatewayパターン(クラウド上のネットワーク環境の切り替え)
 * Shared Serviceパターン(システム共通サービスの共用化)
 * High Availability NATパターン(冗長化されたNATインスタンス)

【Java】 漢数字をアラビア数字(int型)に変換する

$
0
0

はじめに

 * 漢数字をアラビア数字に変換する必要があり、ネットを漁ってたらよさげなサンプルがあったのだが
   一部バグがあったので修正してサンプルをアップする

サンプル

 * 自然数のみ(零は対応しない。やろうと思えばできないこともないが)

Converter.java

import java.security.InvalidParameterException;

public class Converter {

  /**
   * デモ.
   * @param args
   */
  public static void main(String[] args) {
    System.out.println(Converter.convertNaturalKanjiNumber("三"));
    System.out.println(Converter.convertNaturalKanjiNumber("二千五百"));
    System.out.println(Converter.convertNaturalKanjiNumber("三千"));
    System.out.println(Converter.convertNaturalKanjiNumber("一億五千万"));
    System.out.println(Converter.convertNaturalKanjiNumber("一億五千万四"));
    System.out.println(Converter.convertNaturalKanjiNumber("千十一"));
    System.out.println(Converter.convertNaturalKanjiNumber("二十一億三千百五万千二十一"));
    System.out.println(Converter.convertNaturalKanjiNumber("十一億七百一万十一"));
  }

  /**
   * 漢数字(自然数)(をアラビア数字(int型)に変換する
   * @param targetValue 対象値(漢字・自然数)
   * @return 自然数(int型)
   */
  public static int convertNaturalKanjiNumber(String targetValue) {
    int firstDegit = 1;
    int fourthDegit = 0;
    int total = 0;
    for (int i = 0; i < targetValue.length(); i++) {
      char kanjiNumber = targetValue.charAt(i);
      switch (kanjiNumber) {
      case '一':
        firstDegit = 1;
        break;
      case '二':
        firstDegit = 2;
        break;
      case '三':
        firstDegit = 3;
        break;
      case '四':
        firstDegit = 4;
        break;
      case '五':
        firstDegit = 5;
        break;
      case '六':
        firstDegit = 6;
        break;
      case '七':
        firstDegit = 7;
        break;
      case '八':
        firstDegit = 8;
        break;
      case '九':
        firstDegit = 9;
        break;
      case '十':
        fourthDegit += (firstDegit != 0 ? firstDegit : 1) * 10;
        firstDegit = 0;
        break;
      case '百':
        fourthDegit += (firstDegit != 0 ? firstDegit : 1) * 100;
        firstDegit = 0;
        break;
      case '千':
        fourthDegit += (firstDegit != 0 ? firstDegit : 1) * 1_000;
        firstDegit = 0;
        break;
      case '万':
        fourthDegit += firstDegit;
        total += (fourthDegit != 0 ? fourthDegit : 1) * 10_000;
        fourthDegit = 0;
        firstDegit = 0;
        break;
      case '億':
        fourthDegit += firstDegit;
        total += (fourthDegit != 0 ? fourthDegit : 1) * 100_000_000;
        fourthDegit = 0;
        firstDegit = 0;
        break;
      default:
        throw new InvalidParameterException("Found invaid parameter : " + kanjiNumber);
      }
    }
    return total + fourthDegit + firstDegit;
  }
}

出力結果

3
2500
3000
150000000
150000004
1011
2131051021
1107010011

【Linux】ファイルサーバの構築 ~ Samba ~

$
0
0

■ はじめに

 * Windowsファイル共有サーバを構築する必要があるので調べる
  => Samba (サンバ) を使用する

■ 構築

構築環境

 * OS : CentOS7
 * ファイルサーバ : Samba Version 4.4.4

構築手順

[1] インストール
[1-1] Samba をインストールする

sudo yum -y install samba

[1-2] 確認としてバージョンを表示する

smbd -V
# 「Version 4.4.4」と表示
[2] Samba の設定
[2-1] Windows上で、ワークグループを確認する
      (Cドライブがみえるとこで、右クリックし、[プロパティ]で確認できる。
      今回は、ワークグループが「WORKGROUP」だったとする)

[2-2] 「/etc/samba/smb.conf」を修正する

sudo vi /etc/samba/smb.conf

【修正前】
[global]
        workgroup = SAMBA

【修正後】
[global]
        workgroup = WORKGROUP

[2-3] Samba 用のユーザを追加する

# ユーザ「sambaadmin」を追加
sudo useradd sambaadmin

# ユーザ「sambaadmin」を Sambaに追加
sudo smbpasswd -a sambaadmin
# パスワードを入力する(覚えておく。とりあえず、ここでは「password」としておく)
※ 補足 : 設定ファイルのサンプルについて
 * 「less /etc/samba/smb.conf.example」に設定ファイルのサンプルあり。

sudo less /etc/samba/smb.conf.example
[3] Samba の起動
[3-1] Samba を起動する

# ファイル共有、プリンタ共有などのSMBサービスを起動
sudo systemctl start smb.service
# NetBIOSのネームサービスを起動
sudo systemctl start nmb.service

# 念のため、状態を確認(「active (running) 」が表示されていたらOK)
sudo systemctl status smb.service
sudo systemctl status nmb.service

[3-2] 自動起動を設定しておく

sudo systemctl enable smb.service
sudo systemctl enable nmb.service

# 念のため、確認(「enabled」が表示されていたらOK)
sudo systemctl is-enabled smb.service
sudo systemctl is-enabled nmb.service
[4] ファイアウォールの設定
[4-1] ファイアウォールを通るようにしておく

sudo firewall-cmd --permanent --add-service=samba --zone=public
sudo firewall-cmd --reload

# 念のため、確認(「samba-client」が表示されていたらOK)
sudo firewall-cmd --list-all-zones
[5] SELinuxの設定
[5-1] sambaにhomeディレクトリ下の公開を許可する

# sambaにhomeディレクトリ下の公開を許可するかどうかを設定。
sudo setsebool -P samba_enable_home_dirs on

# 念のため、確認(「samba_enable_home_dirs --> on」が表示されていたらOK)
sudo getsebool samba_enable_home_dirs
[6] 動作確認
[6-1] Windows上で「\\XXX.XXX.XXX.XXX」(XXX:Sambaを入れたIPアドレス)を入力
[6-2] [6-1] を行うと、ダイアログ表示され、IDとパスワードを聞かれるので、
      手順[2-3]のユーザIDとパスワードを入力する
      (今回の場合、「sambaadmin」「password」を入力する)
[6-3] [6-2] を行うと、フォルダ「sambaadmin」が表示されており、ダブルクリックすると、
      そのフォルダに入れる(あとは、この中に自由にファイルおけばOK)

■ Sambaあれこれ

共有スペースを指定したディレクトリにするには...

 * 「[5] SELinuxの設定」の場合、「sambaadmin」のホーム直下になるのだが、それは嫌って人に...
[A] ディレクトリ の設定
[A-1] 共有スペースのディレクトリを作成
sudo mkdir -p /var/samba/share

[A-2] アクセス権をフルアクセスできるようにする
sudo chmod 777 /var/samba/share

[A-3] SELinuxでSambaからのアクセスを許可
sudo chcon -R -t samba_share_t /var/samba/share
[B] 設定ファイルの修正
[B-1] 「/etc/samba/smb.conf」の末尾に以下の【追記内容】を追加する

sudo vi /etc/samba/smb.conf

【追記内容】
[share]
	# Windows側から見た時に付加されるコメント
	comment = Share directory
	# 共有するディレクトリのパス
	path = /var/samba/share
	# 有効なユーザ
	valid users = sambaadmin
	# Windowsの共有一覧にホームディレクトリを表示するか
	browseable = Yes
	# 書き込みを許可する
	writable = Yes
	# ファイルのアクセス権を付与
	create mode = 0777
	# ディレクトリのアクセス権を付与
	directory mode = 0777
[C] Sambaの再起動
sudo systemctl restart smb.service
sudo systemctl restart nmb.service
[D] 動作確認
[D-1] Windows上で「\\XXX.XXX.XXX.XXX\share」(XXX:Sambaを入れたIPアドレス)を入力
 => アクセスできるはず

Windowsのネットワークの一覧に表示するには...

[A] 設定ファイルの修正
[A-1] 「/etc/samba/smb.conf」の[global]内に以下の【追記内容】の「# ここから」~「# ここまで」を追加する

sudo vi /etc/samba/smb.conf

【追記内容】
[global]
# ここから
       local master = no
       os level = 65
       preferred master = yes
# ここまで

【Linux】バックアップ ~ rsync ~

$
0
0

■ はじめに

http://blogs.yahoo.co.jp/dk521123/36753771.html
で、ファイルサーバを構築したので、今度はバックアップを考える
 => rsync を使用する

■ 構築

構築環境

 * OS : CentOS7
 * rsync : version 3.0.9

構築手順

[1] インストール
[1-1] rsync をインストールする

sudo yum -y install rsync

[1-2] 確認としてバージョンを表示する

rsync --version
[2] 設定ファイルの追加
[2-1] 「/etc/rsync_exclude.lst」 を追加し

sudo vi /etc/rsync_exclude.lst

- /var/logs/* ← 「/var/logs/」のフォルダの中身をすべて(*)バックアップから除外
+ /var/samba/share/*** ← 「/var/samba/share/」のフォルダの中身をすべて(***)バックアップ対象とする


関連記事

【Linux】ファイルサーバの構築 ~ Samba ~

http://blogs.yahoo.co.jp/dk521123/36753771.html

【VMware】VMware vSphere Hypervisor(無償版ESXi) ~ データ移行編 ~

$
0
0

■ はじめに

 * VMware vSphere Hypervisor(無償版ESXi)でのデータ移行を考える

■ 概要

[1] SSHを有効にする
[2] 仮想マシンデータを引き上げ、移行する
[3] データ移行先のVMware ESXiで仮想マシンを登録する

■ 手順詳細

環境
 * 仮想環境 : VMware vSphere Hypervisor v6.5.0
 * 作業PC:Windows10
 * ファイル転送ソフト : WinSCP 5.9.4(※)

※インストールしていない場合は、事前にインストールしておくこと
http://blogs.yahoo.co.jp/dk521123/16726927.html

[1] SSHを有効にする

データ移行元と移行先のVMware ESXiのSSHを有効にする
[1-1] VMware のWeb UI にブラウザで、アクセスする

https://[VMware ESXiのIP]/ui

[1-2] 「ナビゲーター」欄内にある[ホスト]-[管理]-[サービス]-[TSM-SSH]を右クリックし、「起動」を選択
 => SSHが有効になった

[2] 仮想マシンデータを引き上げ、移行する

[2-1] ファイル転送ソフト「WinSCP」を起動する

[2-2] ログイン画面で以下の項目を入力し、「ログイン」ボタン押下
 * 転送プロトコル:SFTP
 * ホスト名:【データ元のVMware ESXiのIP】
 * ポート番号:22
 * ユーザ名:【ユーザ名(例「root」)】
 * パスワード:【ユーザ・パスワード】

[2-3] 右欄にある「/vmfs/volumes/datastoreX(X:1以上の数字)」のようにたどり、
      仮想データのフォルダを引き上げる

 /vmfs/volumes/datastore1/【仮想データのフォルダ】

[2-4] [2-1]~[2-2]のように、今度は、データ移行先のVMware ESXiのIPを入れログインし、
      [2-3]のデータを同等のフォルダ先「/vmfs/volumes/datastoreX(X:1以上の数字)」配下に置く
 => データ移行自体は完了

[3] データ移行先のVMware ESXiで仮想マシンを登録する

[3-1] データ移行先のVMware のWeb UI 上において、「ナビゲーター」欄内にある
      [ストレージ]-[データストア]-[データスト アブラウザ]-[datastoreX(X:1以上の数字)]-[【仮想データのフォルダ】]
      を選択し、「【仮想データ】.vmx」を右クリックし、「仮想マシンの登録」を選択し「閉じる」ボタン押下
 => 仮想マシン登録完了
[3-2] 確認のために、「ナビゲーター」欄内にある[仮想マシン]を選択し、
      移行した仮想マシンがあるか確認する

補足:自動起動について

[1] 「ナビゲーター」欄内にある[仮想マシン]を選択し、移行した仮想マシンを右クリックし、
    [自動起動]-[優先順位を上げる]を選択

【Linux】CentOS で、RAIDを構築するには...

$
0
0

はじめに

http://blogs.yahoo.co.jp/dk521123/36252928.html
で、CentOSをインストールしたが、RAIDを意識してインストールする

RAIDについては、以下の関連記事を参照のこと。
http://blogs.yahoo.co.jp/dk521123/34557792.html

構築例

構成

まず、初めにどのような構成で、どの位容量を割り当てるかを考える
`パーティション`マウント先
`#
`サイズ
`ファイルシステム `RAID 1 パーティション1 200Mバイト /boot xfs RAID1 2 パーティション2 512Mバイト スワップ スワップ なし 3 パーティション3 残り / xfs RAID5

構築手順

インストールしていく(途中から書く)
[1] [インストール先]-[パーティション構成を行いたい]を選択し、「完了」ボタン押下
[2] 「+」押下し、上記の「構成」になるように作成
 * /boot
  + デバイスタイプ : RAID
  + RAIDレベル : RAID1
 * スワップ
  + デバイスタイプ : 標準パーティション
 * /
  + デバイスタイプ : RAID
  + RAIDレベル : RAID5

関連記事

Linux(仮想環境) を構築する ~CentOS編~

http://blogs.yahoo.co.jp/dk521123/36252928.html

【ストレージ】 RAID

http://blogs.yahoo.co.jp/dk521123/34557792.html

【Java】【Linux】JavaからLinuxのシステム日付を変更するには...

$
0
0

前準備

Linuxのシステム日付を変更する一つの方法として、dateコマンドを実行する必要があるが、
その場合、ルート権限が必要になる。
Java内でdateコマンドを実行しても、以下「エラー時の出力結果」のように表示されてしまい
日付変更できない。そのため、前準備として設定の変更が必要。

エラー時の出力結果

Result Code : 1
sudo: 端末 (tty) が存在せず、パスワードを尋ねる (askpass) プログラムが指定されていません
Done!

設定変更案

「sudo visudo」で、行末に「【実行ユーザ】 ALL=(ALL) NOPASSWD:ALL」に入れる

サンプル

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
  public static void main(String[] args) {
    execute("sudo", "date","--set","2017-03-14 23:02:15.962");
    System.out.println("Done!");
  }

  private static void execute(String... commands) {
    ProcessBuilder processBuilder = new ProcessBuilder(commands);
    // 標準エラー出力を標準出力にマージする
    processBuilder.redirectErrorStream(true);

    try {
      Process process = processBuilder.start();
      int result = process.waitFor();
      System.out.println("Result Code : " + result);

      try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
        String line;
        while ((line = bufferedReader.readLine()) != null) {
          System.out.println(line);
        }
      }
    } catch (IOException | InterruptedException ex) {
      ex.printStackTrace();
    }
  }
}

出力結果

Result Code : 0
2017年  3月 14日 火曜日 23:02:15 JST
Done!

参考文献

http://stackoverflow.com/questions/18682260/how-can-i-change-the-system-clock-of-a-linux-machine-by-using-java
「端末 (tty) が存在せず、パスワードを尋ねる (askpass) プログラムが指定されていません」関連
http://qiita.com/t_n/items/117d990c273b1d25a3a6

関連記事

【Java】 外部プログラム/コマンドを実行するには ~ ProcessBuilder ~ 修正

http://blogs.yahoo.co.jp/dk521123/34842155.html

【Linux】【Eclipse】Linux上で、Eclipse Neon をインストールする

$
0
0

環境

 * OS : CentOS7
 * Java : openjdk version "1.8.0_121"
 * Eclipse : Eclipse Neon2

手順

[1] 以下のサイトから「eclipse-inst-linux64.tar.gz」をダウンロードする
https://www.eclipse.org/downloads/
[2] 以下のコマンドで、解凍する

tar xavf eclipse-inst-linux64.tar.gz

 => ディレクトリ「eclipse-installer」があるはず。

[3] ディレクトリ「eclipse-installer」内に移動し、「eclipse-inst」をダブルクリックする
[4] インストーラが起動するので、インストールしていくだけ
 => 物凄い簡単にできた!

確認用 Hello World!

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

【Linux】特殊なアクセス権 ~ SUID / SGID / Sticky Bit ~

$
0
0

■ SUID

 * SUID : Set User ID
 * 実行ファイルに設定される属性
 * 実行ファイルの所有者の権限で実行(どのユーザがファイルを実行しても、セットされたユーザで実行)

確認の仕方

ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 54192 11月 18  2015 /usr/bin/passwd
   ~
# 「s」になっているとSUIDが設定されていることを意味する

設定方法

sudo chmod u+s 【設定したいファイルのパス】

■ SGID

 * SGID : Set Group ID
 * 実行ファイル/ディレクトリに設定される属性
 * 実行ファイルは所有グループの権限で実行

設定方法

sudo chmod g+s 【設定したいファイルのパス】

# SUIDも付与したいなら...
#
# => sudo chmod ug+s 【設定したいファイルのパス】

■ Sticky Bit

 * スティッキービット
 * アクセス権に関係なくて、所有者とrootユーザのみが名前の変更と削除を行える

【Java】デーモンスレッド (Daemon Thread)

$
0
0

はじめに

スレッドには、以下の2種類ある。

1) デーモンスレッド ★今回、扱う事項★
2) ユーザスレッド ... デフォルト
API仕様
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Thread.html

デーモンスレッドとは?

 * プログラム終了のタイミングで、スレッド処理が破棄される

利点

 * 終了処理(後処理)を意識しないですむ

使用上の注意

 * スレッド内で、後処理が必要な処理(リソース破棄 (データベース接続、一時ファイルなど) 
   を行う場合、使用を控える

作成方法

Thread thread = new Thread();
thread.setDaemon(true); // ★setDaemonにtrueをセット★
thread.start();

※ setDaemon()は、start()より先に呼ばないとダメらしい
http://hiratara.hatenadiary.jp/entry/20060725/1153838234

実験

(i) ユーザスレッドの場合

public class Main {

  public static void main(String[] args) {
    Thread thread = new Thread(() -> {
      for (int i = 0; i < 10; i++) {
        try {
          Thread.sleep(10L);
        } catch (InterruptedException ex) {
          ex.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName());
      }
    });
    //thread.setDaemon(true); // ★ユーザスレッド★
    thread.start();

    System.out.println("Done : " + thread.isAlive());
  }
}
出力結果 (スレッドが実行「Thread-0」されている)
Done : true
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0

(ii) デーモンスレッドの場合

・・・
thread.setDaemon(true); // ★デーモンスレッド(上記のサンプルのコメントを外した)★
・・・
出力結果 (スレッドが実行されない)
Done : true

Viewing all 860 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>