OmniAICreator/Qiita-1.07M huggingface dataset:
ORACLEと接続するJavaで作ったバッチ処理が動かないときの対処方法

JavaからOracleデータベースに接続するバッチで去年度以下のような経験をしました。
その対処方法です。
発生するのはLinuxのみでWindowsだと起こりません。

## 現象
* Javaで作ったバッチを動かすと１回目はさらっと流れる。
* ２回目を動かすと、なんか起動にやたらと時間がかかる。
* ２回目以降、そもそも起動エラーになることもある。
* でも時間を置くと１度目に動かしたときと同じようにさらっと流れる。

## 原因
動いていない（ように見えている）箇所でスレッドダンプを取って出てきたクラスを
片っ端からGoogle検索に突っ込んで調べた結果、
[ここのページ](http://tmftake.hateblo.jp/entry/20130130/1359553276)に遭遇できました。
DBコネクション取得時にOracle JDBCドライバ内から呼び出しているSecureRandomクラスでのシード生成で時間がかかるらしいです。
[バグレポート](http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6202721)にも上がっていました。

## 対処方法
Javaの起動引数に以下を追加してあげればOK。

```lang:起動オプション
-Djava.security.egd=file:/dev/./urandom
```

# 2016/12/12追記
環境が書いてなかったですね、すみません。

## 環境
* OS ： Redhat6.7
* Java : 1.8_45
* Oracle : 11g xe
Raspberry Piでrbenvを使ってRubyをインストールする


## rbenv

```bash:pi
$ cd /opt/src
$ git clone https://github.com/rbenv/rbenv.git
$ sudoedit /etc/profile.d/rbenv.sh
```

```bash:/etc/profile.d/rbenv.sh
export RBENV_ROOT=/opt/src/rbenv
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"
```

```bash:pi
$ source /etc/profile.d/rbenv.sh
```

## ruby-build

```bash:pi
$ mkdir /opt/src/rbenv/plugins
$ cd /opt/src/rbenv/plugins
$ git clone git://github.com/sstephenson/ruby-build.git
$ cd /opt/src/rbenv/plugins/ruby-build
$ sudo ./install.sh
```

## rbenv-gemset

```bash:pi
$ cd /opt/src/rbenv/plugins
$ git clone git://github.com/jamis/rbenv-gemset.git
```

## rbenv-binstubs

```bash:pi
$ cd /opt/src/rbenv/plugins
$ git clone https://github.com/ianheggie/rbenv-binstubs.git
```

## Ruby

```bash:pi
$ sudo apt-get install -y libreadline-dev
$ rbenv install 2.4.0
$ rbenv rehash
$ rbenv global 2.4.0
```
Railsのlogに出したくない情報をちゃんと出さないようにする

# ログに残したくない情報
Webアプリケーションを開発していると時々生のままではログに残したくない情報ってありますよね。
パスワード、クレジットカード番号やCVCなんかは残したくないものの代表じゃないかと思います。

# よくやる方法
initializersの中でこういうコードを入れるか、

```rb
Rails.application.config.filter_parameters += ['password', 'card_number']
```


application.rbの中でこうするかがよくやる方法じゃないかと。

```rb
module TestRailsApp
  class Application < Rails::Application
    config.filter_parameters += ['password', 'card_number']
  end
end
```

こうすると`params`に`password`や`card_number`があれば必ずその値は`[FILTERED]`になります。

```rb
{
  email: 'test@test.test',
  password: '[FILTERED]'
}
```

下のようにネストされていても、`[FILTERED]`にしてくれます。

```
{
  user: {
    password: '[FILTERED]',
    card: {
      card_number: '[FILTERED]'
    }
  }
}
```

手作業ではネストされてるところはうっかりしがちですが、ちゃんとフィルタリングしてくれるのはありがたい。

これでとりあえず安心

# もう少しかゆいところに届くように

しかし、実際はパスワードを確認のためにユーザーに2回パスワードを入れてもらうこともありますよね。
`password`と`password_confirmation`みたいに。

そのとき、

```rb
config.filter_parameters += ['password', 'card_number']
```

という書き方では`password_confirmation`の方がそのままログに出力されてしまい、せっかく`password`が`[FILTERED]`になってても意味がありません。
でも、いちいち

```rb
config.filter_parameters += ['password', 'password_confirmation']
```

というように指定を増やしていくのも大変ですよね。忘れそうだし。


そういう場合を考えて正規表現でのフィルタリングが可能になっています。

```rb
config.filter_parameters += [/password/]
```

雑にこんな風にするだけでもかなり防げます。

`password`という名前が入っている場合はたいていログに残したくないものなのでこうしておくのがいいかなと思ってます。


# ActionDispatch::Http::ParameterFilterを使う

ちなみにこの`[FILTERED]`にする仕組みは[ActionDispatch::Http::ParameterFilter](http://api.rubyonrails.org/classes/ActionDispatch/Http/FilterParameters.html)を使って実現されています。

なので、railsのlogger以外のところでも同様のことをやりたい場合はこういうことも出来ます。

```rb
filter = ActionDispatch::Http::ParameterFilter.new([/password/])
filter.filter(params)
```

rails以外のloggerなどに出力することは時々あるので覚えておくと便利
Basic認証とフォームによる認証についてのまとめ


Basic認証(HTTP認証)とフォームによる認証を比較しつつ、ユーザ認証についてまとめてみた。
認証の仕組みについて、概念的なところのふわっとした理解の足しにする目的で書いている。

Webは基本的にオープンなネットワークである。接続さえしてしまえば世界中の膨大な数のWebサービスにアクセスできる。逆に自らサービスをWeb上で公開したとしたら、全世界のあらゆる端末からリクエストを受ける可能性がある。誰とでも通信できるだけでなく、通信内容は誰もがアクセスできるネットワークの上を行き来して行われる。このようなWeb上での通信は

* なりすまし
* 改ざん
* 事後否認(自分が行った通信を、他人のなりすましや改ざんのせいだ、と言い張る行為)
* 盗聴

といったセキュリティ上の脅威に常にさらされている。このためWebサービスを作る上で、「通信相手が誰であるかを証明する」=「ユーザ認証」の仕組みが必要になってくる。実用的なユーザ認証に対する要件は、

要件1. 手続きが簡単であり使いやすい、あるいはサービス側で実装しやすいこと
要件2. セキュリティが強固であること

という２つが基本だ。難しいのはこの2つの要件はトレードオフの関係にあることだと思う。

# Basic認証とフォームによる認証

よく利用される認証方式として、Basic認証とフォームによる認証の２つがある。それぞれ、ユーザがユーザIDとパスワードを入力してサーバ側でそれを検証する、という基本原理は同じだが、内部の仕組みと使いどころが違う。

Basic認証は一般ユーザ向けのサービスで利用されることはないが、一般公開されておらず利用者が限定されている内部的なWebサービスでは利用されることも多い。一方でフォームによる認証は現状のWebサービスにおける、ユーザ認証の主流となっている。

２つの認証方式を比較する上で、認証の手続きを以下の３ステップに分けて説明してみる。

1. 事前準備は何か？
2. 認証成立の手続きはどのようなものか？
3. 認証成立後、認証情報をどのように管理するか？

## Basic認証

手順は以下のようになる。

1. サーバ側でユーザID・パスワードを設定してこれをユーザに(メールなど)で配布する.
2. ユーザは、サーバにアクセスしたとき、ブラウザのBasic認証用の入力フォームを利用して、ユーザ名とパスワードを入力する。サーバ側では、HTTPサーバが送られてきたリクエストのヘッダを見て、ユーザを認証する。
3. 一度ログインが確立した後はブラウザが前回入力されたユーザID・パスワードを覚えていて、自動でHTTPのAuthorizationヘッダにユーザIDとパスワードを埋め込んで送信する.　2.と同様に、HTTPサーバがリクエストのAuthorizationヘッダのユーザ名とパスワードを検証してユーザを認証する。

Basic認証はHTTP認証として[RFC2617](http://tools.ietf.org/html/rfc2617)で規定されている認証方式の一つである。
HTTP認証には、Digest認証という方式もあるが通信時にユーザID・パスワードをハッシュ化する点がBasic認証とは異なるだけなので、ここでは説明を割愛する。

上記のRFCに注意書きされているように、Basic認証は最も簡単で便利だが、それ単体では安全な認証方式ではない.
ユーザID・パスワードが通信経路上にそのまま送られるため、パスワード漏洩のリスクが大きいためだ。

>   "HTTP/1.0", includes the specification for a Basic Access
>   Authentication scheme. This scheme is not considered to be a secure
>   method of user authentication (unless used in conjunction with some
>   external secure system such as SSL [5]), as the user name and
>   password are passed over the network as cleartext.

さらに、後述のフォーム認証と比較して、ログアウトできない、ホストをまたいだシングルサインオンが難しい、といった機能的に劣る点がある(https://www.rcis.aist.go.jp/special/MutualAuth/faq/detail-ja.html#formauth). 一方で、Basic認証はHTTPサーバの設定だけで簡単に実現できるため、内部システムの認証方式としては使い勝手が良い.


## フォームによる認証

ここでは、「フォーム入力によるユーザID・パスワードの送信とクッキーを用いたセッション管理」によるユーザ認証を、「フォームによる認証」と呼んでいる。現在のWebサービスではフォームによるユーザ認証を行うのが普通だ。

具体的な手順は、

1. ユーザ登録ページにて、ユーザが自分で指定したキーとシークレットをサーバ側に登録する。
2. ユーザは、ログインページにて、ユーザID・パスワードを入力し送信する。サーバ側ではこれを検証し、登録されているユーザID・パスワードと一致すれば認証を確立する。このとき、認証情報を保存する目的で、セッションIDを発行しレスポンスクッキーにセッションIDを付与する。サーバ側でもにもユーザIDとセッションIDをひもづけて保管しておく。
3. 次回のユーザリクエスト時には、ブラウザがサーバからもらったクッキーをリクエストに付与して送信する。サーバ側は、リクエストクッキー内のセッションIDを、サーバ側で記録しておいたセッションIDと比較検証することで、ユーザのログイン状態を判定する。

上記の認証処理はBasic認証(HTTP認証)と異なり、Webアプリ・サーバ側で実装される。前述のとおり、フォームによる認証のサービス・システム設計・実装のポイントはいろいろある。例えば、どのタイミングでログインを要求するか(非ログインでどこまでサービスを利用できるか)、セキュリティホールを作らないログイン・ログアウトの実装、ホスト間でのシングルサインオン、といった点をサービスに合わせてに設計・実装する必要がある。
Golangで、ResponseWriterを使ってHTTPレスポンスを組み立てる際にハマったこと


GolangでHTTPサーバーを立てて、ブラウザからアクセスしたところ、毎回セッションが新しく作り直される現象にハマりました。  

いろいろデバッグしていたところ、どうやら、レスポンスヘッダーをセットする前に、レスポンスボディーをセットしてしまうのがいけなかったようです。

あとでドキュメント読んだら、普通に書いてありましたが、`io.WriteString`や`json.NewEncoder(w).Encode`などでコンテンツを書き込んでしまうと、レスポンスヘッダーを書き込めなくなってしまうようです。

順番は下記のようにしないと正常に動作しません。

1. w.Header().Set("<name>" "<value>")
2. w.WriteHeader(404)   // 通常処理(status 200 OK)以外の場合は設定
3. w.Write (html/json/xmlなどレスポンスタイプ毎に対応したメソッドを呼ぶ)

コンテンツを書き込んだあとに、セッション保存していたため、レスポンスヘッダーの`Set-Cookie`が無視され毎回セッション再生成される現象に陥りました。

http://golang.org/pkg/net/http/#ResponseWriter

```server.go
// A ResponseWriter interface is used by an HTTP handler to
// construct an HTTP response.
type ResponseWriter interface {
	// Header returns the header map that will be sent by WriteHeader.
	// Changing the header after a call to WriteHeader (or Write) has
	// no effect.
	Header() Header

	// Write writes the data to the connection as part of an HTTP reply.
	// If WriteHeader has not yet been called, Write calls WriteHeader(http.StatusOK)
	// before writing the data.  If the Header does not contain a
	// Content-Type line, Write adds a Content-Type set to the result of passing
	// the initial 512 bytes of written data to DetectContentType.
	Write([]byte) (int, error)

	// WriteHeader sends an HTTP response header with status code.
	// If WriteHeader is not called explicitly, the first call to Write
	// will trigger an implicit WriteHeader(http.StatusOK).
	// Thus explicit calls to WriteHeader are mainly used to
	// send error codes.
	WriteHeader(int)
}
```

## まとめ

ドキュメントはちゃんと読もう
Log of preparation for Setup GitLab...


A memorandum for installation GitLab :-D

# Server Setup

## Apache and ssl

`# yum install httpd`
`# yum install openssl mod_ssl`

`# cd /etc/httpd/conf`
`# openssl genrsa -aes128 1024 > server.key`
`# openssl req -new -key server.key > server.csr`

`# vim ../conf.d/ssl.conf`

```
- SSLCertificateFile /etc/pki/...
+ SSLCertificateFile /etc/httpd/conf/server.crt

- SSLCertificateKeyFile /etc/pki/...
+ SSLCertificateKeyFile /etc/httpd/conf/server.key 
```

referenced at http://dotnsf.blog.jp/archives/3181024.html

## Setup iptables
Add 80 and 443 port to `/etc/sysconfig/iptables`

```
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
```

referenced at http://www.karakaram.com/onamae-com-vps2-iptables

## Setup ssh
First, create ssh key pair.

On local machine,
`$ ssh-keygen`
`$ scp ~/.ssh/id_rsa.pub USERNAME@IP_ADDR:/home/USERNAME/pub.key`
`$ ssh USERNAME@IP_ADDR`

On remote machine,
`$ mv pub.key .ssh/authorized_keys`
`$ sudo vim /etc/ssh/sshd_config`

```
-#PubkeyAuthentication yes
+PubkeyAuthentication yes

-PasswordAuthentication yes
+PasswordAuthentication no
```
referenced at http://ubuntu.u-aizu.ac.jp/004/index.html

## Run httpd
`$ sudo /etc/init.d/httpd start`

# Setup GitLab

## Install GitLab
Execute the commands that these are descripted as below:
referenced https://about.gitlab.com/downloads/, and http://blog.ybbo.net/2015/03/15/how-to-install-gitlab-to-centos6/

In order to visit GitLab, stop Apache.
We use nginx instead of Apache.
`$ sudo /etc/init.d/httpd stop`
And then, visit
`http://HOSTNAME/`

## Configuration for SSL

based on http://qiita.com/usutani/items/004328ccffe6a3ee8667

## Configuration for Mail

http://stackoverflow.com/questions/24189079/gitlab-wont-send-email-omnibus-gitlab-centos-6-5

https://gitlab.com/gitlab-org/omnibus-gitlab/blob/629def0a7a26e7c2326566f0758d4a27857b52a3/doc/settings/smtp.md

But I changed general user password by Administorator...

# First Commit to GitLab
Before proceed this section, I should create project to GitLab.

```
$ git clone git@FQDN:USERNAME/PROJECTNAME.git
$ cd PROJECTNAME
$ touch README.md
$ git add README.md
$ git commit -m "first commit"
$ git push origin master
```

Good job!
node.js の CVSS v3 モジュールを使ってデモページを作ってみた

[前回](http://qiita.com/spiegel-im-spiegel/items/d6fe10d3df92b9d8556b)の続き。

[cvss3] のロジックはできたので（まだ基本評価基準のみだけど），これをブラウザ上でも使えるようにする。

Web 上をあちこち回ってみたが [webpack] を使うのがよさげである。今回の用途にはオーバースペックではあるが，練習を兼ねて使ってみる。以下のページがとても参考になった。感謝。

- [gulp.jsを使ってフロントエンドのビルドをする【webpack, stylus】 - yutaponのブログ](http://yutapon.hatenablog.com/entry/2014/12/06/123000)

[spiegel-im-spiegel/cvss-demo](https://github.com/spiegel-im-spiegel/cvss-demo) に開発環境を置いている。以下のページで実際に動いているのを確認できる。

- [Demo for CVSS v3](http://www.baldanders.info/spiegel/archive/cvss/cvss3.html)

デモページでは `[Score]` ボタンを押すと Vector 情報を出力し，その Vector 情報を [cvss3] で計算して Score を表示している。すべてクライアント側で動作しているのでご心配なく。

## ハマりどころ

[cvss3] ではオブジェクトを階層的に配置している。たとえば BaseMetrics オブジェクトを生成するには

```javascript:app.js
var cvss3 = require('cvss3');
var base = new cvss3.BaseMetrics();
```

のように記述する。オブジェクトを階層的に配置することで Java 的な名前空間を構成している。 [node.js] ではこれで問題なく動作したが， [webpack] で JavaScript をバンドルするとうまくいかないようだ。上述のようなコードを書くと「`BaseMetrics` なんてコンストラクタはねーよ，バカ」（超意訳）とか怒られる。

色々試してみたが，オブジェクトを階層的に配置するのはダメらしい。なので，そこはすっぱり諦めて `global` 直下に並列に配置することにした。例えば上述のコードは

```javascript:app.js
require('cvss3');
var base = new CVSS3_Base();
```

と書けば目的のオブジェクトを生成できる。もっとうまいやり方があるかも知れないが，週末も終わるし，本業が忙しくなってしばらく構ってあげられないと思うので，当面はこれで行ってみる。

[webpack]: http://webpack.github.io/ "webpack module bundler"
[cvss3]: https://github.com/spiegel-im-spiegel/cvss3 "spiegel-im-spiegel/cvss3"
[node.js]: https://nodejs.org/ "Node.js"
Django+Celery でバッチスケジュール


##概要

* Django で開発したアプリケーションでバッチスケジュールを行う。
* Celery を利用して開発する。

	※詳細は学習し切れていないのでこれから勉強。動かすところまでメモ。

##やりたいこと
* Django で開発したアプリケーションの裏で、バッチ処理をスケジューリングする
* アプリケーションと同一サーバ上で処理を起動する

## 環境
* Mac OS X Yosemite 10.10.4
* Python3.4
* Django1.8
* Celery3.1
* django-celery3.1


## 参考情報

* Celery
	* http://celery.readthedocs.org/en/latest/index.html
* Periodic Tasks
	* http://celery.readthedocs.org/en/latest/userguide/periodic-tasks.html


##準備

* 必要なパッケージを pip install

```
pip install celery
pip install django-celery
```

##コーディング

* 構成
	* sebastian(Project)
	* appmanager(Application)

```
sebastian
  └-appmanager
      └-tasks.py
      └-
     
  └-sebastian
      └-celery.py
      └-settings.py
      
```

* コード

```python:sebastian/settings.py

# 30秒毎に処理起動(Cronのように日時指定の設定も可能）
from datetime import timedelta
CELERYBEAT_SCHEDULE = {
    'add-every-30-seconds': {
        'task': 'appmanager.tasks.test_celery',
        'schedule': timedelta(seconds=30),
        'args': (16, 16)
    },
}

CELERY_TIMEZONE = 'UTC'

BROKER_URL = 'django://'

```

```python:sebastian/celery.py
from __future__ import absolute_import

import os

from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sebastian.settings')

from django.conf import settings

app = Celery('sebastian')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

app.conf.update(
    CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend',
)

app.conf.update(
    CELERY_RESULT_BACKEND='djcelery.backends.cache:CacheBackend',
)

@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))
```

```python:appmanager/tasks.py
from __future__ import absolute_import

import logging
from celery import task
from celery.utils.log import get_task_logger
from appmanager import models

@task
def test_celery(x, y):
    logger = get_task_logger(__name__)
    # orm で取得した結果をログ出力し続ける(Django のログでなく、Celeryのログ）
    application_inf = models.ApplicationInf.objects.get(pk=8)
    logger.info('func start  ----------------->')
    logger.info('application:%s', application_inf.name)
    logger.info('func end -------------------->')
    return x + y
    
```

* 実行

```
celery -A sebastian worker -B -l info
```

* 実行結果

```
func start  ----------------->
application:TEST_APP
func end -------------------->
```
【JAWS-UG関西女子会】作成したインスタンスの削除方法

<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-65307172-1', 'auto');
  ga('send', 'pageview');

</script>

#はじめに
この記事はJAWS-UG関西女子会「はじめて女子応援企画！事例から学ぶもくもく＆もぐもぐ会」で
 ~~もぐもぐ~~ [^1] もくもくする際のテキストとなります。
[^1]: 節子！それは懇親会や！！


#本記事について
AWSアカウントは作成してから1年間の間、無料枠の範囲内であればお金がかからずに利用ができます。
ただし、今回作成したインスタンスには無料範囲外でお金がかかってしまうものもあります。
このため、いじり倒して気が済んだら削除してしまいましょう！

##CloudFrontの削除方法
以下URLを参考にしてくください
http://docs.aws.amazon.com/ja_jp/gettingstarted/latest/swh/getting-started-cleanup-cloudfront.html

##S3の削除方法
以下URLを参考にしてくください
http://docs.aws.amazon.com/ja_jp/gettingstarted/latest/swh/getting-started-cleanup-s3.html

##Route 53 の削除方法
※独自ドメイン割当てをした場合
以下URLを参考にしてくください
http://docs.aws.amazon.com/ja_jp/gettingstarted/latest/swh/getting-started-cleanup-route53.html

##EC2インスタンスの削除方法
以下URLを参考にしてくください
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/terminating-instances.html

##ELBの削除方法
以下URLを参考にしてくください
http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/elb-getting-started.html#delete-load-balancer

##RDSの削除方法
以下URLを参考にしてくください
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_DeleteInstance.html
Meteor で isServer なコードのデバッグを行う方法(1.x系)


Meteor でサーバーサイドのデバッグをする方法です。
Meteor 1.1.0.2 で動作確認しました。

# Meteor サーバーサイドのデバッグ手順

Meteor をデバッグモードで立ち上げます。

```bash
$ meteor debug
```


```bash:ログ
[[[[[ ~/meteor-example-app ]]]]]

=> Started proxy.
   Starting your app                         -
Your application is now paused and ready for debugging!

To debug the server process using a graphical debugging interface,
visit this URL in your web browser:
http://localhost:8080/debug?port=5858
```

「visit this URL in your web browser:」に表示されている URL (http://localhost:8080/debug?port=5858) にブラウザでアクセスします。

すると、Webインスペクタが表示されますので、クライアント側と同じような感覚でサーバー側のデバッグが行えます(なんだか不思議な気分です)。

ソースコード一覧を表示し、デバッグを行いたいコードにブレイクポイントを設定することで一時停止したり、変数の値を確認したりすることができます。

デバッグモードで meteor を起動すると、はじめはポーズ状態になっているので、先に進めたい場合はWebインスペクタの三角マークをクリックしてアプリケーションの停止を解除する必要があります。

# 余談

ちなみに、WebKit系のブラウザ(Google Chrome, Safari)でないと動かないようです。Firefox では動きませんでした。

また、Web 上で Meteor のデバッグ方法を調べると、NODE_OPTIONS='--debug-brk' と 
node-inspector を利用する方法が見つかりますが、0.x 系のバージョンのデバッグ方法のようです。
1.x 系を利用している方は meteor debug を使用する方が簡単です。

それではよい Meteor ライフを！

# 参考

- Server-side debugging broken in latest Meteor - Meteor forums<br>https://forums.meteor.com/t/server-side-debugging-broken-in-latest-meteor/788
Crystal の OptionParser


Crystal の OptionParser を試してみる。

class OptionParser 
http://crystal-lang.org/api/index.html#http%3A//crystal-lang.org/api/OptionParser.html

まずはプロジェクトを作成。

```
% crystal init app hello
% cd hello
% vim src/hello.cr
```
内容は以下。

```ruby
require "./hello/*"
require "option_parser"

name  = "World"
times = 1

OptionParser.new do |opt|
  opt.on("-n NAME",  "--name=NAME",   "name option")   { |v| name  = v }
  opt.on("-t TIMES", "--times=TIMES", "times option")  { |v| times = v }
end.parse!

times.to_i.times {
  puts "Hello, #{name}"
}
```

ほとんど Ruby の optparse と同じだけど `on` の第3引数 `description` が省略できないっぽい。
https://github.com/manastech/crystal/blob/42efdbf797349d70c1e2e4c0ece607c6ed419077/src/option_parser.cr#L42-L51

ビルドして実行。

```
% crystal build src/hello.cr 

% ./hello
Hello, World

% ./hello --name=Foo --times=3 
Hello, Foo
Hello, Foo
Hello, Foo

% ./hello -n Bar -t 2
Hello, Bar
Hello, Bar
```
[Swift] ViewContollerの切り替え

```lang:FirstViewController.swift
UIApplication.sharedApplication().keyWindow!.rootViewController = SecondViewController()
```
UIViewからでも同じ書き方で遷移可能。
ViewControllerを切り替える方法を検索すると、モーダルで実現する方法がほとんどだが、頻繁に切り替えないならこの方法で良いのではないか？
（注）触り始めて間もない人の言うことなのであまり信用しないでください。
project-find-navigation つくった

2017.2.17 追記 ここから
メンテしません。代わりに(なると思う人は) https://atom.io/packages/narrow を使ってください。
2017.2.17 追記 ここまで

[project-find-navigation](https://atom.io/packages/project-find-navigation)

![gif](https://raw.githubusercontent.com/t9md/t9md/55e7fd32500d45751e2d7824f008e42b06763cd1/img/atom-project-find-navigation.gif)

Dirty hack によって、[find-and-replace](https://github.com/atom/find-and-replace) パッケージが提供する、project-find のナビゲーションを改善する。

# これは何か？

[find-and-replace](https://github.com/atom/find-and-replace) は project-find を提供している。
プロジェクトの全ファイルを対象に検索出来る機能だ。  
この機能自体は良いのだが、ナビゲーションに不満がある。
分かりやすいところでは、キーボード操作で、検索結果を移動できない等。

このパッケージを使うことで、project-find の 検索結果にキーボードで移動できるようになる。

# おことわり

このパッケージは、大々的に、直接的に、[find-and-replace](https://github.com/atom/find-and-replace) が提供する内部的な変数や、関数に依存してりう。
将来、 find-and-replace のコードが変わったら動かなくなるかもしれません。
その変更内容があまりにも大きい場合は、このパッケージで追随するのを諦めるかもしれません。
そういう意味でこのパッケージは、本質的には、実験的、コンセプト証明(Proof of concept)的なものです。
project-find の検索結果のナビゲーションをどのように改善できるかという実験です。

# 機能

以下、このパッケージが提供する機能の概要です。
素の find-and-replace の project-find と比較しています。

|  アクション       | 素の project-find  | project-find-navigation  |
| ------------- |-------------| -----|
| `mousedown`   | 見つかった位置に移動して範囲選択 | 見つかった位置にスクロールしてフラッシュ、フォーカスは結果一覧に留まる |
| `dblclick`   | N/A | 見つかった位置に移動して、フラッシュ、範囲選択はしない |
| confirm   | 見つかった位置に移動して範囲選択 | 見つかった位置に移動して、フラッシュ、範囲選択はしない |
| confirm-and-continue | N/A | 見つかった位置にスクロールしてフラッシュ、フォーカスは結果一覧に留まる |
| select-next-and-confirm | N/A | 次のエントリを選択し、`confirm-and-continue`(オートプレビュー的な動作) |
| select-prev-and-confirm | N/A | 前のエントリを選択し、`confirm-and-continue`(オートプレビュー的な動作) |
| activate-results-pane | N/A | 検索結果一覧(results-pane) にフォーカスを変える |

その他の機能

- TextEditor 内のマッチをハイライト(decorate), 検索結果一覧を閉じると、自動でハイライトはクリアされる。
- エントリにジャンプする際、 **隣接(adjacent)** Pane で開く. これは、例えば検索結果一覧のPane が左 Pane で開いていた場合は、右Paneで、ジャンプターゲットを開くという事。

# キーマップ

デフォルトのキーマップは無し。

e.g.

私の設定。 Vim ライクなキーバインドで、検索結果を移動できるようにしている。

```coffeescript
'.preview-pane.project-find-navigation':
  'l':     'core:move-right'
  'h':     'core:move-left'
  'j':     'project-find-navigation:select-next-and-confirm'
  'k':     'project-find-navigation:select-prev-and-confirm'
  'enter': 'project-find-navigation:confirm'

'atom-workspace:not([mini])':
  # このキーマップは、window:toggle-full-screen を上書きする(私は使っていないのでOK)
  'ctrl-cmd-f': 'project-find-navigation:activate-results-pane'
```
今さら人に聞けなくなってきた時のRailsのキホン


「Ruby on Rails 4 アプリケーションプログラミング」を一読。気づいたことなど書き綴ります。

## Rails(アプリケーションフレームワーク)とは何か
「それで、Railsって何なんですか？」といつの日か聞かれるかもしれない…。何なんだふれぃむわーくって…?となる前に目を通しておきたい。

- Rails = アプリケーションフレームワーク
- PCのマザーボードのようなもの
- ひとつのアプリケーションを作るのに最適な既成の枠組み
- 個々の開発者が枠組みに対してパーツを付与し完成させる
- アプリケーション自体が開発者の用意したコードを適切に実行する
- 主導権がアプリケーションにあり開発者は規約にそって開発する

**※フレームワークには以下の様なメリットがある。**

1. 開発生産性の向上
  > すべての開発者が一定の規約にしたがって開発するために一貫性の担保が可能。かつ機能単位に役割分担しやすい。

2. メンテナスの容易さ
  > コードに一貫性があるため可読性が向上する。またアプリケーション間の統合や分離も比較的容易に実現できる。

3. 品質の担保
  > オープンソースで公開されているフレームワークは大勢の開発者の目に晒され、テストされているため相対的に高い信頼性を期待できる。

## Railsに通底する2つの概念
Railsを使用した開発を行っていると必ず耳にする2つの哲学。意味も説明できずに「DRYじゃないよね〜」とか口ずさむ大人にはなりたくない。

1. `DRY` (Don't Repeat Yourself)
  **「同じ記述を繰り返さない」**
  > ソースコードの中で同じような処理や定義を記述することを極度に嫌う傾向にある。例えばデータベースにテーブルを作成するときには構造定義を記述する必要がない。Railsが自動的に認識してくれる部分が多くある。
	
2. `CoC` (Convention over Configuration)
  **「設定よりも規約」**
  > Railsが予め用意している名前付けのルールを表す場合が多い。usersテーブルを利用する際にUserクラスを作るだけで関連付けされるのはRailsの規約に依る。

## Railsの構成要素たち
Railsにはアプリケーション開発を支える様々な機能や初期設定が組み込まれています。1つのメソッドを当たり前のように使えるのもRailsの涙ぐましい努力のおかげ…かも。

```text:
【予備知識：MVCとは】

	RailsのアプリケーションはMVCモデルに則る。

	◆ Model 		:ビジネスロジック
	◆ View		:ユーザーインターフェース
	◆ Controller	:全体の管理
	
	簡潔に言うと、
	
	◆ モデルはデータの保存や取り出し等の操作をし
	◆ ビューは処理結果に応じて個別のページを描画し
	◆ コントローラーはリクエストに応じてそれらを適切に管理する
	
	という役割分担のなされた構造である。
	これによりデザイン面・ロジック面共同での開発も容易になる。
```

1. Action Pack
  - Action Controller

        > Controllerの管理。リクエスト処理等を司る。　
  - Action View

        > HTMLなど各種フォーマットでのユーザー側へのレスポンスを生成する。ビュー開発に役立つレイアウト機能やヘルパーも提供。
  - Action Dispatch

        > リクエストをどこで処理するか決定するルーティング機能を提供。

2. Active Model

    > 命名規則などModelの基本的な規約を定義する。
	
3. Active Record

    > データベースアクセスのための基本機能を提供する。
	
4. Active Mailer

    > メールの送受信を管理する。
	
5. Active Support
	
    > Ruby標準ライブラリの拡張を担う。
	
6. Railties
	
    > Railsの各種構成要素等を繋ぎ合わせるRailsの中心核。

## Railsアプリケーションの中身
Railsで開発しようとした時に必ず通る道 `rails new` 。ところでこいつら何なんだ?ってファイルはありませんか？

1. **/app :`アプリケーションのメインフォルダ`**
    - /assets `画像/javascript/cssファイルなどのリソース`
      - /images -> 画像ファイル
      - /javascripts -> Javascript(CoffeeScript)ライブラリ
      - /stylesheets -> CSS(SCSS)ライブラリ
    - /controllers `コントローラクラス`
        - /concerns -> コントローラ共通モジュール
        - application_controller.rb -> アプリケーション共通のコントローラ
    - /helpers `ビューヘルパー`
        - application_helper.rb -> アプリケーション共通のビューヘルパー
    - /mailers `Action Mailer実装クラス`
    - /models `モデルクラス`
        - /concerns -> モデル共通モジュール
    - /views `ビュースクリプト`
        - /layouts -> レイアウト
        - application.html.erb -> アプリケーション共通のレイアウト

2. **/bin :`コード生成や開発サーバの起動に関するヘルパー`**
3. **/config :`アプリケーション本体・ルーティング等の設定情報`**
    - /environments `環境単位の設定ファイル`
    - /initializers `初期化ファイル`
    - /locales `辞書ファイル`
4. **/db :`DB本体やスキーマ情報・マイグレーションファイル`**
5. **/lib :`自作のライブラリなど`**
    - /assets `自作ライブラリに関するアセット`
    - /task `タスク関連`
6. **/log :`ログの出力先`**
7. **/public :`公開フォルダ`**
8. **/test :`テストスクリプトなど`**
9. **/tmp :`一時ファイル`**
10. **/vendor :`サードパーティーのコード`**
    - /assets `サードパーティから提供されるアセット`
11. **config.ru :`アプリケーションのエントリポイント`**
12. **Gemfile :`必要なgemファイルを定義`**
13. **Rakefile :`ターミナルから実行可能なジョブ`**
14. **README :`readmeファイル`**

---

最後の方の雑感…(´・ω・｀)
VMware Player上にEsxiを導入する

Esxiの検証環境が欲しいなぁ思って調べたところ、VMwarePlayerに入れれることが分かったのでやってみた。

VMwarePlayerのバージョン
6.0.7 build-2844087

最新のEsxi6だと上手く認識されなかったので、5.5をダウンロード
https://my.vmware.com/jp/group/vmware/evalcenter?p=free-esxi5

新規マシンの作成をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/47012/1eef982c-da9a-4478-e9e9-8b5776fb26f5.png)

ダウンロードしたEsxiのisoファイルを指定し、「次へ」をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/47012/d875d635-9d5b-3231-2a29-8458159b3896.png)

仮想マシンの名前と保存先を指定し、「次へ」をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/47012/64b827ce-8fae-d005-ac03-91748ab6ed31.png)

ディスク容量の指定をし、「次へ」をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/47012/8807f7a7-b9be-bab6-74fd-fc6a64c94702.png)

「完了」をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/47012/6ec24076-a223-4605-95a8-6e059a9ad2da.png)

インストーラが起動するのをしばし待つ
![image](https://qiita-image-store.s3.amazonaws.com/0/47012/dc503623-369b-e073-c40a-996f7e636837.png)

「Enter」を押下
![image](https://qiita-image-store.s3.amazonaws.com/0/47012/63df1d06-bfbc-bbb4-8a9d-fa7f08dad552.png)

「F11」を押下
![image](https://qiita-image-store.s3.amazonaws.com/0/47012/36f6744d-0bcd-2a47-e9b4-da2f797d9933.png)

「Enter」を押下
![image](https://qiita-image-store.s3.amazonaws.com/0/47012/c80ca97d-e0fd-3a09-37db-941e0b23736a.png)

「Japanese」を選択し、「Enter」を押下
![image](https://qiita-image-store.s3.amazonaws.com/0/47012/ff9a0d43-c101-73cd-3bc9-6ff8ea8d2e42.png)

パスワードを入力し、「Enter」を押下
![image](https://qiita-image-store.s3.amazonaws.com/0/47012/c2c704d8-379b-8a7e-5725-404c30a59ca0.png)

「F11」を押下
![image](https://qiita-image-store.s3.amazonaws.com/0/47012/20bd749c-44a6-302c-e62b-95fd9424b8ea.png)

「Enter」を押下
![image](https://qiita-image-store.s3.amazonaws.com/0/47012/050411b1-ce8b-a618-031e-695fd5dc0f3f.png)

画面外の「インストールを完了しました」をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/47012/f938ccec-536e-b2c4-8280-754f1f42d293.png)

つないでみる
![image](https://qiita-image-store.s3.amazonaws.com/0/47012/6137d865-86aa-5569-e0fd-45618d7b6270.png)

「OK」をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/47012/5cf3d209-c423-cc37-602b-9aa9c0a46ef6.png)

無事出来あがり♪
![image](https://qiita-image-store.s3.amazonaws.com/0/47012/eb6f045f-bf5c-9cf5-0079-1cfe2587abaa.png)
atomのmarkdown-previewで日本語が豆腐になる(Ubuntu)

Ubuntuのatomでmarkdownが豆腐(□)になってしまう件の対処。

# 環境

* Ubuntu 15.04
* atom 1.0.0

# 対処前の状態
markdown-previewを表示すると、日本語が全て□になってしまう。  

![markdown_before.png](https://qiita-image-store.s3.amazonaws.com/0/6889/e6731e74-d969-572b-683d-fa9bb0b8e9a2.png)

SettingsのFont Familyに日本語フォントを設定してもダメ。

# 対処

メニューのEdit -> Preferences -> Open Config Folder を選択。
styles.lessを開き、font-familyの設定を行う。
以下の"Source Han Code JP"は、自分の環境にインストールしている日本語フォントなので、自分の環境にインストールしている日本語フォント名を設定する。

```css:styles.less
* {
    font-family: Source Han Code JP;
}

.markdown-preview {
    h1,h2,h3,h4,h5,h6 {
      font-family: Source Han Code JP;
    }
}
```

# 対処後
日本語も全て表示されるようになった。

![markdown_after.png](https://qiita-image-store.s3.amazonaws.com/0/6889/2ccd8e82-a3a0-76cb-5eb8-103c9729d6e6.png)



# 参考

* https://github.com/atom/atom/issues/6214
* http://qiita.com/kjunichi/items/4bb9a4ec879f85865307
暑いのでインタラクティブなVRについて考える

最近、CardBoardの素材をプラにしたBotsNew
http://botsnew.com/
なる3Dゴーグルを購入したので、VRで遊んでいました。

しかしながら、このBotsNew(CardBoardタイプ全部に言えることですが)、筐体を保持するために両手が奪われるので見回すくらいしか操作ができない → 全然ゲームっぽくない！

ということでどうやって操作するか、試行錯誤してみました。

#音で操作する
![20150726-162916.png](https://qiita-image-store.s3.amazonaws.com/0/8904/a3c73672-acd0-24ed-09c1-7baef2eaf418.png)

Zombieが四方八方から襲ってくるので、キャーなりイヤーッなり叫ぶと正面に球を飛ばすシューティングの例

イヤボーンっぽくて面白いは面白いのですが、周りの人の反応を見ているとやはり声を出すのはハードルが高いようでした。

#視線で操作する
![20150726-163532.png](https://qiita-image-store.s3.amazonaws.com/0/8904/44c0a7c6-3622-1b3c-ad8d-275bfb1cdd45.png)
選択肢を視点の中心に置いて数秒間保持することで選択するUI

サマーレッスンのUIっぽいものを再現したかったので
https://www.youtube.com/watch?t=69&v=Z9463NLOeRA

いったんものすごく長いコライダを頭の下に置くことで再現してみました。
![スクリーンショット 2015-07-26 16.38.31.png](https://qiita-image-store.s3.amazonaws.com/0/8904/0a930301-6261-1da4-a566-92d5a7cbe8c7.png)

レールスクロールなネプリーグっぽいVR作ったら楽しそうですね。


####引き続き、インタラクティブなVRについて探っていこうと思います。
MySQL 大容量画像データが挿入、表示できない。対処方法(PHP逆引きレシピより）wondaの備忘録

画像の表示はデータベースのほうが管理しやすいとのことで、
SHOEISHAのPHP逆引きレシピ266「イメージデータを格納したい」をサンプルとして試した。

:scream_cat: 4MBで設定しているはずがデータベースに挿入できるのはせいぜい300KBまで。これはどうしたということで調べましたが、何箇所かいじらねばならない箇所があったため備忘録として残しておきます。

初期設定では上記のようにファイル容量が上がるとエラーが起こるかと思います。

エラーメッセージ
Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. 

:key: このように出たらテーブルのROW_FORMATをDYNAMICに変更します。xampp/mysql/bin/my.iniを開き
# The MySQL server
[mysqld]
の下に以下の3行を追加
こうしないとそもそもCOMPACTからDYNAMICに切り替えられません。

innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix
さらに
max_allowed_packet = 1M
ここを
max_allowed_packet = 8M　に変更。

MySQLを再起動しテーブルの設定を変更
phpMyAdminではテーブルに入り「操作」のテーブルオプションから切り替え可能です。照合順序はutf8mb4_general_ciに設定します。

utf8mb4は文字コードの一種で、UTF8で4バイト文字を扱う事が出来るものらしいです。まあ、大容量を扱う場合はこちらを使うということでしょうか。ROW-FORMATをDYNAMICへ。

これで、ほっとしてたのですが、エラーが消えません！

実はもう1つ変更しなければならない箇所があります。
再びxampp/mysql/bin/my.iniへ。

:key: 今度は
innodb_log_file_size = 5M
innodb_log_buffer_size = 8M

を

innodb_log_file_size = 500M
innodb_log_buffer_size = 800M
などと変更します。

大容量画像の挿入が失敗する原因は
ここの設定にありました。転送時に容量オーバーを
起こすようです。

以上、設定の変更が完了したら
MySQLを再起動してプログラムを試してみてください。
見事に大きなファイルサイズの画像が表示されるはずです。

表示は最初縮小画像（サムネイル）になっておりますので
クリックすると実際のサイズで表示されます。
Objective-Cを読解しなくちゃいけなくなった(初心者向け)

仕事で簡易的なiOSアプリを作ることになりました。
が、全く経験ありません。
Swiftデビューか！と思いきや、
使用するsdkがObjective-Cで書かれていました。
なので読解のため
@や[[ ]]の入れ子など謎が多いオブシー(と略すらしい)
の基礎勉強まとめです。

![9k=.jpg](https://qiita-image-store.s3.amazonaws.com/0/76843/db11c7a1-c820-966f-bb69-0b14b58edbe7.jpeg)

 ↑絵本シリーズは丁寧で深く良いです。

#1,Objective-Cとは
・C 言語の基本構造をベースにして、Smalltalk 言語を取り入れた言語。
・NSString型 など　よくNSが登場するが、これはジョブズがAppleを追い出されてた時期につくった NeXT社のOSのNeXTSTEPの名残。
・クラス型や生成方法がヘッダファイルで定義されているため、その実体は C 言語の構造体を typedef 文で隠蔽している

#2,文字列
```objc:sample
 NSString* str = @"abcdefg";
 NSLog(@"%@", str) //ログ出力
```

#3,配列
```objc:sample
 NSArray* arr;
 arr = [NSArray arayWithObjects: @"abc", @"def", @"ghi", nil];

 int i;
 for (i = 0; i < [arr count]; i++){
    NSLog(@"%@", [arr objectAtIndex:i]);
 }
```
#4,クラス
objective-cのクラスはインターフェース部と実装部の2つから構成される

 []をメッセージ式と呼び、クラスやオブジェクトに対してメッセージを送る
 という流儀でメソッドを呼ぶ。

```objc:sample 
 // インターフェース部   @interface ~ @end  までに記述 Animalがクラス名
 @interface Animal : NSObject
 {
    int age;
 }
-(void)showFood;
 @end
 
 
 // 実装部  implementation ~ @end  までに記述
 @implementation Animal
 -(void)showFood{
     NSLog(@"美味しいさかな");
 }
 @end

 // オブシェクトの生成
 int main() {
    Animal* cat = [Animal alloc]; // 生成
    cat = [cat init]; // 初期化
    [cat showFood]; // メソッド呼び出し

    return 0;
}

```

独特の流儀や記述が多いけど、Swiftみたいな
おしゃれ感はないけれど僕は好きになれそうでした。
 フジロック疲れが凄いので本日はここまでにします
ライフサイクルやメモリ管理の仕組みとかも学ばなければ！
Zone apexとCNAME

## 忙しい人のためのまとめ
Zone apex(ドメイン名そのもの)をCNAMEにマッピングすることはできない(できたとしても動作の保証がない)。

原理は次の通り。

* CNAMEと他のレコードは同居できない
* 一方、Zone apexには少なくともNSレコードを設定する必要がある
* したがってZone apexにCNAMEをマップした場合、上記が矛盾することとなる

詳細は下記のブログに記載されている。(素晴らしい記事です)
http://tech.blog.aerie.jp/entry/2014/09/09/162135

定義はRFC 1912を見る。
http://tools.ietf.org/html/rfc1912#section-2.4

> 2.4 CNAME records
   A CNAME record is not allowed to coexist with any other data.  In
   other words, if suzy.podunk.xx is an alias for sue.podunk.xx, you
   can't also have an MX record for suzy.podunk.edu, or an A record, or
   even a TXT record.

## Route 53での解決(回避)
Route 53のエイリアスレコードを用いると、zone apexをELB名などにマッピングすることができる。

http://aws.amazon.com/jp/route53/faqs/#Supported_DNS_record_types
> Q: Amazon Route 53 はどの DNS レコードタイプをサポートしますか?
> 
Amazon Route 53 は現在、以下の DNS レコードタイプをサポートしています。
(中略)
加えて、Route 53 は「エイリアス」レコードを提供します（Route 53 固有の仮想レコード）。エイリアスレコードの用途は、ホストゾーン内のリソースレコードセットを、Elastic Load Balancing ロードバランサー、CloudFront ディストリビューション、またはウェブサイトとして設定されている S3 バケットにマッピングすることです。エイリアスレコードは CNAME レコードのように機能するので、DNS 名（example.com）を別の「ターゲット」DNS 名（elb1234.elb.amazonaws.com）にマッピングできます。それらはリソルバーに表示されていないという点で、CNAME レコードと異なります。リソルバーには、A レコードと結果として生じるターゲットレコードの IP アドレスだけが表示されます。
NetBeans + Java EEでHello worldまで

* Mac OS 10.9.5
* Java 1.7 がインストール済み

# NetBeansをインストール
1. https://netbeans.org/downloads/
からダウンロード
2. ダウンロードされたnetbeans-8.0.2-javaee-macosx.dmgをダブルクリック
3. 画面に従って進める

# プロジェクトを作成
1. ファイル ==> 新規プロジェクト
2. JavaEE ==> エンタープライズ•アプリケーション ==> 次
3. アプリケーション名を任意の名前にして ==> 次

# プロジェクト実行
1. プロジェクトウインドウから「プロジェクト」を右クリック ==> 実行
2. ブラウザにTODO write contentが表示される

# index.htmlを変更して,Hello Worldを表示させる
1. プロジェクト名-war ==> Webページ ==> WEB-INF ==> index.htmlを開く
2. index.htmlのTODO write contentと書かれている部分を, Hello worldに置き換える
3. ブラウザを見てみると,
【FileMaker】文字列を取り出す

最近メール本文から情報を抽出する事例をやったので、備忘録です。
文字列から対象の文字列を抽出して、テーブルの各フィールドにセットします。

テーブル構成は、次の通りです。

| フィールド名 | タイプ |
|:------------|:------|
| 本文 | テキスト |
| 名前 | 計算 |

（名前フィールドはテキストタイプでも計算でもどっちでもOK）
例えば、以下のような本文フィールドにメール内容をセットした際、名前フィールドには本文から抽出した名前がセットされるように処理をします。

本文は、以下のような例文とします。

>お申し込みありがとうございます。
>
> 以下の内容で承りました。
> [お名前] なんとか　かんとか
> [生年月日] 2000/1/1

名前フィールドの計算式として、[Let](http://www.filemaker.com/help/13/fmp/ja/html/func_ref3.33.16.html)の中で抽出する文字列の識別子となる「[」と「]」に囲まれた開始文字位置と終了文字位置を[position](http://www.filemaker.com/help/13/fmp/ja/html/func_ref3.33.78.html#703102)で求め、識別子分の文字数を[Length](http://www.filemaker.com/help/13/fmp/ja/html/func_ref3.33.71.html#702491)で求めた後、[Middle](http://www.filemaker.com/help/13/fmp/ja/html/func_ref3.33.73.html#702651)で本文から識別子以降の該当の文字列を抽出します。

```
Let ( 
      [ 
moji% = "[お名前]" ; 
pos_start% = Position ( 本文 ; moji% ; 1 ; 1 ) ;
moji_cnt% = Length ( moji% ) ; 
pos_end% = Position ( 本文 ; "¶" ; pos_start% ; 1 ) - 1 ;
      ] ; 
if(pos_start%  ≠  0;Middle ( 本文 ; pos_start% + moji_cnt% ; pos_end% - ( pos_start% + moji_cnt% ) + 1 )  ;
)
```

ちなみに、「[お名前]」が本文になかったことを考え、開始ポジションが取得できたときのみ処理しています。

あと、「[お名前]」の他に「[名前]」のような識別子が混在していた場合は、また今度。
Windows で ghq look した時のシェルを CMD じゃなくて Bash にしたい

## 概要

Windows上でghqを使っている時に、`ghq look` すると新しく cmd が立ち上がって来ます。

普段から cmd で使ってれば違和感はないですが、
Git Bash や Msys2 など Bash を使ってるのにこれをされると辛いですね。

そこで何とか `ghq look` で bash を起動してやれないか試してみました。

## `ghq look` の動き

リポジトリの該当箇所を確認すると `runtime.GOOS` の結果、Windowsだったら
環境変数 `COMSPEC` からターミナルのパスを取得して実行するような処理になっていました。

ref: https://github.com/motemen/ghq/blob/bdfcba594aba1d514ff8336ef3bd07422d0fc444/commands.go#L305-L314

```go
if runtime.GOOS == "windows" {
    cmd := exec.Command(os.Getenv("COMSPEC"))
    cmd.Stdin = os.Stdin
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr
    cmd.Dir = reposFound[0].FullPath
    err := cmd.Start()
    if err == nil {
        cmd.Wait()
        os.Exit(0)
```

試しに見てみましょう。

```sh
$ echo $COMSPEC
C:\WINDOWS\system32\cmd.exe

$ echo $SHELL
/usr/bin/bash
```

なるほど、確かにCMDへのパスが入ってますね。
ちなみにこの値、システムのプロパティ から 環境変数 の 設定画面からも確認できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35603/24aab609-3b17-6003-3ed2-e0ef8e4bbc39.png)

というわけで ghq に限って この値を指定した上で実行すれば良さそうです。

## 解決方法

`.bashrc` を編集し、 ghq に 下記のエイリアスを張り、環境変数をゴニョって標準ターミナルを
CMD から `$SHELL` に格納されているものに変更した上で実行するようにします。

```sh:.bashrc
alias ghq='COMSPEC="$SHELL" ghq'
```

Msys2 など `$SHELL` がデフォルトで入ってこない環境は事前に変数をセットしてください。
CoreOSのtoolboxが便利

## 参考

* https://github.com/coreos/toolbox

## 修正

```bash:~/.toolboxrc
TOOLBOX_DOCKER_IMAGE=ubuntu-debootstrap
TOOLBOX_DOCKER_TAG=latest
```

```bash:
toolbox
```

* ubuntu-debootstrap:latest のコンテナでbashが起動する。
* コンテナから抜けても中身は維持される。

## toolboxからdockerコマンドも使いたい場合

```bash:
toolbox --bind=/run:/run
```

alias設定するには

```bash:~/.bash_profile
alias toolbox='toolbox --bind=/run:/run'
```

## toolboxの削除

```bash:
rm -rf /var/lib/toolbox/*
```


# 自分用インストーラ

* [install.sh](https://github.com/tukiyo/dockerimage-ja/blob/master/toolbox/install.sh)

```bash:
curl https://raw.githubusercontent.com/tukiyo/dockerimage-ja/master/toolbox/install.sh | sh
```
CoreOSにscreenをインストールする君作った

## 使い方

```bash:インストール
sudo wget -q https://raw.githubusercontent.com/tukiyo/coreos-screen.run/master/screen.run -O /usr/share/oem/screen.run
sudo sh /usr/share/oem/screen.run
```

* OS再起動した後は以下だけ再度実行する

```bash:OS再起動後
sudo sh /usr/share/oem/screen.run
```

# 作成メモ

## ubuntuからファイルのコピー

```bash:生成元
docker run -it ubuntu-debootstrap /bin/bash
apt-get update
apt-get install -y screen
```

```bash:screenコマンドと不足しているライブラリのコピー
docker cp a1:/lib/x86_64-linux-gnu/libtinfo.so.5 libtinfo.so.5 
docker cp a1:/lib/x86_64-linux-gnu/libpam.so.0 libpam.so.0
docker cp a1:/lib/x86_64-linux-gnu/libaudit.so.1 libaudit.so.1
```

## インストーラ作成

```bash:
wget https://codeload.github.com/megastep/makeself/legacy.tar.gz/master
tar xzf master
cd megastep-makeself-be1c982
```

```bash:screenフォルダ作成
mkdir screen && cd screen
```

```bash:install.sh
#!/bin/sh
LIBDIR=/usr/share/oem/lib
BINDIR=/opt/bin
RUNDIR=/var/run/screen

if [ `whoami` != root ];then
    echo "usage: sudo $0"
    exit 1
fi

install -m 755 -d $LIBDIR
install -m 755 -d $BINDIR
install -m 777 -d $RUNDIR

for file in libaudit.so.1 libpam.so.0 libtinfo.so.5
do
    cp -a $file $LIBDIR
done
ldconfig

cp -a screen $BINDIR

echo "screen command install done."
```

以下をscreenフォルダに保存

* install.sh
* libaudit.so.1
* libpam.so.0
* libtinfo.so.5
* screen


```bash:screen.run作成
./makeself.sh ./screen/ ../screen.run "SFX installer for screen" ./install.sh
```

* [GitHub](https://github.com/tukiyo/coreos-screen.run)
nokogiriスクレイピング練習　もうすこし他のケースも試す

# はじめに
nokogiriの使い方を勉強しながら、rubyの復習をするような話。

#前提条件
rubyはもちろん、gemにnokogiriが存在すること
実行するソースファイルと処理対象ファイルが同じディレクトリに存在すること（コード参照。読み込むファイルを）

# 処理対象（仮にread.htmlとする）　前回と同じ

ここで記載されているソース
http://vsanna.sakura.ne.jp/wp/2015/01/scraping_start_up2/

# コード perser1-1.rb（ツッコミどころ満載）

<pre>
# ノコギリ読み込みます。
require 'nokogiri'

#呼び出し部分をメソッド化する
def iwant(doc,list)
	#欲しいものを拾って
	what_i_want = (doc).xpath(list)
	#単純表示
	puts what_i_want
end


#読み込みたいファイルを読み込んでインスタンス生成
f = File.open("read.html")
doc = Nokogiri::HTML(f);
f.close

#対象リスト指定し、メソッド呼び出し
list ="html/body/p"
comment = "pタグで囲われているものを抽出するケース。"

hash = {"list" => list , "comment" => comment }

print(hash)
puts "\n"
iwant(doc,list)

list= "/html/body/ul/li"
comment = "liタグで囲われているものを抽出するケース。"

hash = {"list" => list , "comment" => comment }

print(hash)
puts "\n"
iwant(doc,list)


list= "/html/body/ul/li[1]"
comment = "liタグで囲われている最初の一つを抽出するケース。"

hash = {"list" => list , "comment" => comment }

print(hash)
puts "\n"
iwant(doc,list)
</pre>

# 実行コマンド
<pre>
$ ruby parser1-1.rb
</pre>

#実行結果

Qiita上ではうまく表示できないので、
こちらを参照（gistにしました）

https://gist.github.com/rojiuratech/efe60c92bee86a2ba314

# 余談
メソッドと引数で与えてみた。
これも前振りです
nokogiriスクレイピング練習　はろーわーるど　（くどい説明多数）

#はじめに

既存htmlファイルの改修とか、スクレイピングとかが必要になりました。
そこで、nokogoriを使って処理を試そうと思いました。
と、ついでにrubyの復習も。

ツッコミ等大歓迎

# 調査対象（仮にread.htmlとする）

ここで記載されているソース
http://vsanna.sakura.ne.jp/wp/2015/01/scraping_start_up2/


# ソースコード　仮に parser1.rb とでもします。

```ruby
# ノコギリ読み込みます。
require 'nokogiri'

#読み込みたいファイルを読み込んでインスタンス生成
f = File.open("read.html")
doc = Nokogiri::HTML(f);
f.close

#欲しいものを拾って
what_i_want = (doc).xpath("/html/body/p")

#単純表示
puts what_i_want
```

#実施コマンド

```sh
$ ruby parser1.rb
```

#結果
```html
<p>これは本文。ほげほげ。</p>
```

#やたらこまかい解説

##　ライブラリ”nokogiri” を読み込む
```ruby
# ノコギリ読み込みます。
require 'nokogiri'
```

ライブラリを読み込むときは、require で読み込むこと。
require は、対象物を１回だけ読み込む。


## ファイルを読み、インスタンスを生成する。

```ruby
#読み込みたいファイルを読み込んでインスタンス生成
f = File.open("read.html")
doc = Nokogiri::HTML(f);
f.close
```

ファイルのストリームを開く
開いたストリームから、ノコギリのインスタンスを生成する。
ストリームを使い終わったら、閉じる（忘れずに）

## xpathを使い、取得対象を特定する。

xpath　とは、htmlやxmlのツリー構造を利用して、欲しい要素を（node）を特定するを特定する手法とのこと。
ここでは、さきほど指定したnokogiri のインスタンスを指定します。

基本文法は

```ruby
取得結果 = (nokogiriのインスタンス).xpath("ツリー構造")
```

したがって

```ruby
what_i_want = (doc).xpath("/html/body/p")
```

ここでは、what_i_want に対し、nokogiriメソッドに対しpathにてhtmlタグ、bodyタグ、pタグで
囲まれている領域を指すことになります。

## 取得結果を表示します

```ruby
#単純表示
puts what_i_want
```

ここでは、putsを利用した。pメソッドだと結果がうまく表示されない。

#参考、引用元

【スクレイピングのやり方#2】周りに勧められてスクレイピングなるものをしてみたいけど何すればいいのかわからなかったあの日の自分へ

http://vsanna.sakura.ne.jp/wp/2015/01/scraping_start_up2/

第１８章　ロード
http://i.loveruby.net/ja/rhg/book/load.html
requireとinclude のちがい
http://qiita.com/yanap/items/65c3953fb4e52218399a

puts命令
http://ref.xaio.jp/ruby/classes/kernel/puts

#余談
htmlそのまま記載できればなー。\<pre\>タグではだめみたい。
git 付属のPerlやunzipとかを使いたいけどsort,find,lnとかは要らない

C:\Program Files\Git\bin を %PATH% に加えると、msysGit についてくる UNIX系コマンドが入ってくる。Perl とか unzip はは嬉しいが、bash ではなくコマンドプロンプトから使う場合など、sort,find,ln などあまり使いたくないコマンドまでたどれてしまう。できれば、必要な奴だけ、ピンポイントで使いたい。

最初 mklink で、git\bin にある perl.exe のハードリンクを、他の%PATH%ディレクトリに作ろうとしたが、DLL を見失うせいか、だめだったー

ということで、nyagos の alias で、必要なコマンドだけをフルパスに変換する暴挙に走った。

```Lua:.nyagos
do
    local gitbin = nyagos.which("git.exe"):gsub("[^\\]+",function(s)
        if s == "cmd" then
            return "bin"
        end
    end):gsub("\\[^\\]+$","")

    for _,name in ipairs{ "perl","unzip" } do
        nyagos.alias[ name ]= string.format('"%s\\%s"',gitbin,name)
    end
end
```

結果

```
$ alias | gawk '/perl/ || /unzip/'
unzip="C:\Program Files (x86)\Git\bin\unzip"
perl="C:\Program Files (x86)\Git\bin\perl"
```

お分かりいただけたであろうか
CentOS 7でWebサーバ構築のための有用リンク集

CentOS 7 Install & Initial Settings
* 固定IP設定
* add user
* sudoers
* keyboard layout
* host name setting

言語設定
http://www.infology.jp/InfologyWebServer/weblog;jsessionid=A471F64D92823B03F19B5FF0E4093E1F?0&infologywebId=22

locale setting
http://blog.livedoor.jp/kazu_fukuzawa/archives/26995378.html

CentOSでUbuntuのbuild essentialのようなことをする
http://blog.64p.org/entry/2013/07/22/142457

apacheのインストールと設定
http://centos.server-manual.com/centos5_apache2.html
vsftpdのインストールと設定
http://www.server-world.info/query?os=CentOS_7&p=ftp

デーモン自動起動
http://qiita.com/tamamius/items/448c350ca34e4db9f6f5

Commands

```
# マシン起動時にhttpd起動
sudo systemctl enable httpd
# httpd 再起動
sudo systemctl restart httpd
# マシン起動時にvsftpd起動
sudo systemctl enable vsftpd
# vsftpd 再起動
sudo systemctl restart vsftpd
```

webページで表示するファイルの置き場所を変えた時の設定．
/home/username/ 以下などにファイルを置くと，apacheがユーザディレクトリを参照する権限がないためエラーがでる．
[htmlの保存場所を変更したら、変更後のページが表示しなくなってしまった](http://kajuhome.com/web_trouble.shtml#n02)


apacheを外部公開するためファイアウォールの設定でポート80番などを開く．
httpの部分をftpなどに変えてftpのポート21番も開く
http://qiita.com/sky_y/items/b92fa6ba57d926f25370

install php
http://www.unix-power.net/centos7/php.html

apacheのcgi設定
http://www.unix-power.net/centos7/apache.html

ディレクトリ一覧とテストページ非表示
http://hack.aipo.com/archives/181/

リダイレクト
http://onlineconsultant.jp/pukiwiki/?%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E3%80%80Javascript%E3%81%A8meta%E3%82%BF%E3%82%B0%E3%81%A9%E3%81%A1%E3%82%89%E3%81%8C%E6%97%A9%E3%81%84


cliでusb mount umount．USBがNTFSだといろいろインストールが必要だったのでメモ
http://ufuso.jp/wp/?p=15073
http://ufuso.jp/wp/?p=15241

いろいろインストールしたのち，
```
sudo mount -t ntfs-3g /dev/sdb1 /mnt/disk
sudo umount /mnt/disk
```

php5.4の文法への対応
http://php.net/manual/ja/language.variables.external.php



perl インストール
http://blog.77jp.net/perl-5100-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB-linux
http://www.server-world.info/query?os=CentOS_7&p=httpd&f=2


ftpの権限設定関係
http://rtaki.sakura.ne.jp/infra/?p=2056
userlist_deny
http://www.vpswordpress-admindocs.com/vsftpd/trouble/06
settings
http://blog.sugulab.com/?p=1635

SELinuxで書き方間違えるとかなりまずいという話
http://totech.hateblo.jp/entry/2015/04/05/223714
SELinuxでの権限の設定方法
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Security-Enhanced_Linux/sect-Security-Enhanced_Linux-Working_with_SELinux-SELinux_Contexts_Labeling_Files.html


perl chmod
ユーザディレクトリにあるファイルの権限chmod 705にする．
apache? or perlが実行権限がないとperl実行できなくてcgiのページエラーになる
https://forum.directadmin.com/showthread.php?t=47583



ftpでファイル送れない問題
いろいろと権限などの設定
http://www005.upp.so-net.ne.jp/develop-tom/centos/vsftpd-centos.html



Selinuxの無効化
Apacheのルートをユーザディレクトリにすると，Selinuxでファイルの所有者？の設定をhttpdにするとユーザがftpでアクセスしたときにファイルが見えない．逆に所有者をユーザにするとブラウザからアクセスしても見えない．これはapacheがユーザディレクトリにあるファイルを参照する権限がないため．

無効化するときの注意
/etc/sysconfig/selinux
を直接いじると危ない．sshでアクセスできなくなったりする．
/etc/selinux/config
を編集してrebootする．



CGIの動作テスト
うまく行かなかったら
/var/log/httpd/error_log
をみながら

perl hello
http://stackoverflow.com/questions/21698645/how-to-run-cgi-script-on-apache-server
某超有名IT企業で機械学習を仕事にしている友人に聞いた機械学習(自然言語処理)独習のために身に付けておきたいコト

# 全くのド素人のメモです.
オススメの勉強法やテキスト,資料等がありましたらコメントいただけたら嬉しいです.
## 某，超有名IT企業で機械学習を仕事にしている友人から教わった勉強法とアドバイス
>[コーセラの機械学習の動画 Machine Learning by Stanford University](https://www.coursera.org/learn/machine-learning/home/week/1)  は,わかりやすいよ。 
本だと, 奥村学[『言語処理のための機械学習入門』](http://amzn.to/2eTVCz1)
> 結構範囲が広いから結局どんな事したいか、どんな場面で使いたいのかわかると、そのための分野から勉強できて効率良いよ。

とのこと.(ありがとう:smile:)

そして,奥村学[『言語処理のための機械学習入門』](http://amzn.to/2eTVCz1)でググっていたら,[首都大学東京 自然言語処理研究室（小町研）自然言語処理を独習したい人のために](http://cl.sd.tmu.ac.jp/prospective/prerequisite)を見つけ,具体的な身に付けておくべきスキルが書かれていたのでまとめる.
## 数学
理工系の学部1年生程度の微分積分・線形代数の知識

「ベクトル（内積）」
「連立方程式」
「確率（同時確率・条件付 き確率、確率変数・確率分布）」
「数列（等差数列・極限）」
「微分（対数関数・指数関数の導関数、合成関数の微分、関数の極大・極小および最大・最小）」
「行列（固有値、逆行列）」
あたりをよく使う.

## 英語
TOEIC 700点台
ひとまず読解能力（論文に書かれている内容を他人に説明できるくらい理解して、プログラムに落とす能力）

## プログラミング
自然言語処理分野で多く使われている言語は、Python・Java・C++ といったところ.
どの言語でもよいので、リファレンスを見なくてもやりたいことがすらすら書けるくらいの言語を一つ作る.
（複数の言語に手を出してどれも中途半端になるより、一つの言語でも使いこなせているほうが、遥かに望ましい）
***
とりあえず,このへんで.
学びたい人のお役に立てたら嬉しいです:shaved_ice:

Please donate at [wish list](http://amzn.to/343JRQu) if you find this useful:thumbsup_tone1:
GitHub Issue で、ソースコードの wrap （改行）と collapse （折りたたみ）ができる Chrome Extension を作ってみた

https://github.com/yoheimuta/github-pre-utility
https://chrome.google.com/webstore/detail/github-pre-utility/ohbmbjnjnkbfnmilcpklobimhkbdcdjl

GitHub Issue や Gist を多用していると、長いソースコードを貼ることがありますが、たまに読みづらかったり、コピペしづらかったり、俯瞰しづらいことがあります

- perl one liner のような 1 行で長いコードやコマンドが wrap （改行）されないので、横にスクロールしないといけない
- 実行ログや SQL 結果など複数行を貼った際に、折りたたみができないので、縦にスクロールをしつづけないと下までたどりつけないことがある

wrap は [Markdown: Use `pre-wrap` instead of `pre` or `nowrap` · Issue #168 · github/markup](https://github.com/github/markup/issues/168) でも議論されていましたが、未対応のままクローズされているので、当面対応されなさそうです

collapse もあまりやりそうな雰囲気が見当たりませんでした

なので、wrap と collapse をそれぞれオンオフできる Chrome Extension を作ってみました  :relieved:

# Demo

http://yoheimuta.github.io/github-pre-utility/ で、Extension をいれていなくても確認できます

- `r キー` を押すと、wrap されることを確認できます
 - もう一度押すと、もとに戻ります
- `t キー` を押すと、collapse されることを確認できます
 - もう一度押すと、もとに戻ります

# オプションページ

- キー操作ではなく、ロードしたときに自動で wrap と collapse をそれぞれオンにすることもできます
 - その場合でも、再度キーを押せばもとに戻ります
- collapse されるソースコードの文字列の長さを指定できます
- デフォルトのキーはそれぞれ、`r` と `t` ですが、変更できます

![image](https://qiita-image-store.s3.amazonaws.com/0/24932/fb59adcc-dae2-d0df-b4ca-be47b81768ee.png)
MITライセンスのソースコードをGithubにあげるまで

完全に個人用メモ感ありますが、参考になればと思いますm__m

## やること
* MITライセンスの原文を取得
* README.mdに記載する
* ソースコードの冒頭にMITライセンス表記をする
* Githubにあげる

## MITライセンスの原文を取得
http://opensource.org/licenses/mit-license.php

ここにMITライセンスの原文があるので、テキスト部分をコピーして`LICENSE.txt`と名付けて、ファイル化します。
`Copyright (c) [year] [fullname]`
上記の[*]を書き換えます。
例：`Copyright (c) 2015 bpyamasinn`

※1  Githubでリポジトリを作成する際に、LICENSEを選ぶセレクトボックスがありますので、そこで作成した際は上記の対応は必要ありません。

※2 MITライセンスの日本語訳
http://sourceforge.jp/projects/opensource/wiki/licenses%2FMIT_license

## README.mdに記載する
README.mdの文末に

```
## License
MIT
```
を追記。

## ソースコードの冒頭にMITライセンス表記をする
MITライセンスにしたい部分のソースコードの冒頭にMITライセンス表記します。
例ではSwiftで記載していますが、どの言語でも変わらないと思います。

```lang:swift
/*
The MIT License (MIT)

Copyright (c) 2015 bpyamasinn.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/

import UIKit
public class ViewController: UIView {
}
```
## Githubにあげる
README.mdとLICENSE.txtをプロジェクトのトップにおいて、
Pushすれば、githubで反映されます。
ieserver.netのddns利用メモ

* majikati.dip.jp を取得したのでメモ

## 方法

```bash:
mkdir -p /srv/ddns && cd /srv/ddns
curl -s http://ieserver.net/ddns-update.txt | nkf -w > ddns-update.pl
chmod +x ddns-update.pl
```

## アカウント情報を記述

```diff:/srv/ddns/ddns-update.pl
  # ieServer.Netにて取得したアカウント（サブドメイン）情報を記入
- $ACCOUNT         = "     ";     # アカウント(サブドメイン)名設定
- $DOMAIN          = "     ";     # ドメイン名設定
- $PASSWORD        = "     ";     # パスワード設定
+ $ACCOUNT         = "majikati";     # アカウント(サブドメイン)名設定
+ $DOMAIN          = "dip.jp";     # ドメイン名設定
+ $PASSWORD        = "xxxxxxxx";     # パスワード設定
```

## 更新処理

```bash:
./ddns-update.pl
```

* current_ip
* ip_update.log

が出来上がる。

## cronに登録

```bash:
8 10 * * * /srv/ddns/ddns-update.pl
```