OmniAICreator/Qiita-1.07M huggingface dataset:
コマンドプロンプトからPostgreSQLを使用する

#■前提
初めてコマンドプロンプトからPostgreSQLを使用する時用の説明になります。
前提としては、以下の通りです。

OS：Windows10
PostgreSQL：バージョン：9.6.1

PostgreSQL
ユーザー：postgres(デフォルトユーザー)
パスワード：test（インストール時に設定したパスワード）

Pathを通して、
コマンドプロンプトから
・ログイン
・SQLを発行して
・ログアウト
の一通りの基本的な操作を行います。

使用するユーザーはデフォルトのスーパーユーザーです。
初めから用意されているユーザーなので特別な準備は必要ありません。

対象は新人さんを想定して書いています。
不足や誤りなどあればコメントいただければ幸いです。

#■Pathを通す
PostgreSQLのインストール先はだいたい同じような場所にあるかと思います。
確認してPostgreSQLのフォルダの対象バージョンのbinをパスに追加します。
（psql.exeが入っているフォルダです）
私のPCでは以下のようになっていました。

	C:\Program Files\PostgreSQL\9.6\bin

![image](https://qiita-image-store.s3.amazonaws.com/0/18220/2ee0b91c-0056-d27c-6662-c819f4dabbc2.png)

システム -> システムの詳細設定 -> 環境変数
変数Pathをダブルクリックして追加


![image](https://qiita-image-store.s3.amazonaws.com/0/18220/3a00591b-0036-c9a5-f43c-d14222dc8623.png)
（スタートを右クリック　->　システム を選択）

![image](https://qiita-image-store.s3.amazonaws.com/0/18220/52d28485-ab91-0310-d6ce-86657e4637b3.png)
（システムの詳細設定 を選択）

![image](https://qiita-image-store.s3.amazonaws.com/0/18220/29f16392-3e73-9963-66e1-0fb974e8762d.png)
（詳細設定タブの環境変数を選択）

![image](https://qiita-image-store.s3.amazonaws.com/0/18220/b713686c-ac1b-bc04-8047-df6a453c4a16.png)
（ユーザーの環境変数のPathをダブルクリック）

![image](https://qiita-image-store.s3.amazonaws.com/0/18220/fc6a9d67-566f-a80d-c851-4e7ede20e754.png)
（新規ボタンを押下し、PostgreSQLのbinのフォルダの場所を入力する）

OKを押下してPathが通ります。

#■コマンドプロンプトからの操作
##・パスが通っているかを確認する
（※Pathを通す前にコマンドプロンプトを立ち上げている場合一度コマンドプロンプトを再起動する）

	psql -V
	psql (PostgreSQL) 9.6.1

バージョンが出れば成功。
（出ない場合はパスを確認、コマンドプロンプトを再起動、PCを再起動の順に確認する）

##・ログイン
	psql -U postgres -d postgres
パスワードを聞かれるので答える。
（今回の場合 test と入力する）

	ユーザ postgres のパスワード:

	psql (9.6.1)
	"help" でヘルプを表示します.
	
	postgres=#
	
と出れば成功。

##・SQLを実行する

SQLを記述する。

	SELECT * FROM pg_shadow;

※この時、末尾のセミコロンを忘れると何も起こらないので注意

	postgres=# SELECT * FROM pg_shadow
	postgres-# (シーン……)

必ず末尾にセミコロンを付けること。

##・ログアウト
ログアウトするには下記のコマンドを入力する。

	\q

（※こちらはセミコロンはいらない）

#■よくあるエラー等
##認証失敗
	FATAL: ユーザ"<ユーザー名>"のパスワード認証に失敗しました (pgjdbc: autodetected server-encoding to be MS932, if the message is not readable, please check database logs and/or host, port, dbname, user, password, pg_hba.conf)
→ パスワードが間違っている。

##DB未指定
	psql: FATAL:  データベース"testuser"は存在しません
→ psql -U <ユーザー名> でログインしようとした時に発生。DBを指定しないとき発生する。
　psql -U <ユーザー名> -d <DB名> とするとログイン出来るようになる。

##権限不足
	org.postgresql.util.PSQLException: ERROR: リレーション <テーブル名> への権限がありません
→ テーブルへのアクセス権限がない。テーブルへのアクセス権限を設定してください。

##pg_hba.confのエラー
	psql: FATAL:  pg_hba.conf の読み込みができませんでした
→ pg_hba.confの記述にエラーがある。
（認証の部分で「md5」と書くべきところを「MD5」と大文字で書いたら発生しました）

##コマンドの大文字小文字の間違い
	psql: illegal option -- u
	詳細は 'psql --help' をごらんください
→ 「psql -u <ユーザ名> -d <DB名>」で発生。-uが小文字になっている。コマンドは大文字小文字を区別するので注意

#■以上
以上です。

これでコマンドプロンプトからSQLを発行することが出来るようになりました。
いろいろなSQLを発行して遊んでみましょう。
はじめはシステムDBをあれこれ検索してみるのがおすすめです。

続き
PostgreSQLでユーザー（ロール）を追加してテーブルにアクセスする
http://qiita.com/wb773/items/248e6e083b2fe12e820a
Yiエディタでtagsを読み込む

# Yiエディタでtagsを読み込む
　yi.hsの設定処理(`ConfigM a`)でタグ(`TagTable`)を読み込むようにしてみます。  
Vimでいう、これ。

```vim:.vimrc
" Reference tags of ctags
let &tags = join([
\  'tags',
\  '.git/tags',
\  '../.git/tags',
\  '../../.git/tags',
\  '../../../.git/tags',
\  '../../../../.git/tags'
\], ',')
```

`ConfigM a`は以下のyiの起動用関数によって実行されます。

- configMain :: Config -> ConfigM () -> IO ()

または`runConfigM`と以下を組み合わせることでも実現できます。

- runConfigM :: ConfigM a -> StateT Config IO a
- flip execStateT defaultConfig . runConfigM :: ConfigM a -> IO Config
- yi :: Config -> IO ()
- startEditor :: Config -> Maybe Editor -> IO ()

`TagTable`はタグファイルとタグ情報のまとまりです。  
以下の関数によって読み込み、設定されます。

- importTagTable :: FilePath -> IO TagTable
- setTags :: TagTable -> EditorM ()


# ConfigM aにTagTableを設定する
　`Config`値コンストラクタの第4引数(`initialActions`に位置する値)に`setTags x`を設定します。

`ConfigM ()`内で`initialActionsA`というLens関数を使います。

- initialActionsA :: Lens' Config [Action]
- (.=) :: MonadState s m => ASetter s s a b -> b -> m ()

`ConfigM ()`は`MonadState Config ()`なので`(initialActionsA .=)`に`[Action]`を渡すことで  
`MonadState Config`の文脈の`Config`値を更新することができます。

- [`Config`](https://www.stackage.org/haddock/lts-7.4/yi-0.12.6/Yi-Types.html#t:Config)
- initialActions :: [Action]


# 実装

```haskell
-- Find ctag file and Load it
findTagTable :: IO (Maybe TagTable)
findTagTable = do
  mayTagFile <- findTagFile maxDepth
  case mayTagFile of
    Nothing      -> return Nothing
    Just tagFile -> Just <$> importTagTable tagFile
  where
    maxDepth = 5

    findTagFile :: Int -> IO (Maybe FilePath)
    findTagFile 0     = return Nothing
    findTagFile depth = do
      let parentsSuffix = foldl' (++) "" . replicate (maxDepth - depth) $ "/.."
      currentDir <- (++) <$> getCurrentDirectory <*> pure parentsSuffix
      x <- sequence [ doesFileExist $ currentDir ++ "/tags"
                    , doesFileExist $ currentDir ++ "/.git/tags" ]
      case x of
        [True, _] -> return . Just $ currentDir ++ "/tags"
        [_, True] -> return . Just $ currentDir ++ "/.git/tags"
        _         -> findTagFile $ depth - 1
```

```haskell
myConfig :: Maybe TagTable -> ConfigM ()
myConfig mayTagTable = do
  configureHaskellMode
  configureMiscModes
  configureMyVim
  case mayTagTable of
    Nothing       -> return ()
    Just tagTable -> do
      let actions = [ EditorA $ setTags tagTable ]
      initialActionsA .= actions
```

以下のように使用します。 ([ただしyi.hsでなくMain.hs版](http://qiita.com/aiya000/items/5627f938e215fad156d3))

```haskell:Main.hs
main :: IO ()
main = do
  mayTagTable <- findTagTable
  config      <- flip execStateT defaultConfig . runConfigM $ myConfig mayTagTable
  startEditor config Nothing
```


# 参考ページ
- [Yi.Tag](https://www.stackage.org/haddock/lts-7.4/yi-0.12.6/Yi-Tag.html)


# 追伸
　プリパラ見ながら書きました。
PCが起動しない > バッテリーを抜く

```txt:動作環境
P社の2000年のノートPC (Windows XP) x 2台
D社の3-5年前のノートPC (Windows7) x 5台 
```

ノートPCが起動しない、という報告を受けて確認すると、確かに起動しない。

色々試した結果、有効だったのが「バッテリーを抜くこと」。

バッテリーの故障のためか、バッテリー搭載時には電源が入らない。バッテリーを抜くと何事もなく起動した、ということをこれまで上記の台数分経験した。

なお、ネットにも接続できないXPのPCについてはよほどの理由がない限りは使用しない方がいい。

なんらかの理由で古いPCを使い続けていて、上記の現象に遭遇したら試してみるのも手である。
メモ : UserAgentを取得する

# WebViewから取得する

```java
WebView webView = new WebView(getApplicationContext());
webView.getSettings().getUserAgentString()
```

## 実行結果

```
Mozilla/5.0 (Linux; Android 7.0; Nexus 5X Build/NBD90W; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/54.0.2840.85 Mobile Safari/537.36
```

# SystemのPropertyから取得する

## ソース

```java
System.getProperty("http.agent")
```

## 実行結果

```
Dalvik/2.1.0 (Linux; U; Android 7.0; Nexus 5X Build/NBD90W)
```
Djangoで作る簡易RSSリーダー

#簡易RSSリーダーを作ってみる

何かしらなんでもいいから作り続けないと身につかないので、以前一度やったことのあるRSSをDjangoを使って取得しにいきます。過去記事を参考にデータベースに放り投げたり、テキストだけ取得してマルコフ連鎖したり色々できそうではあります。

例によってシンプル構成としてみました。

##Viewsを書いていく

```myapp/views.py
import feedparser
import sys, codecs
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)

from django.http import (HttpResponse, HttpResponseRedirect,)
from django.shortcuts import (render, redirect,)
from django.core.mail import (send_mail, BadHeaderError,)

def index(request):
    url = 'http://news.yahoo.co.jp/pickup/local/rss.xml'
    feeder = feedparser.parse(url)

    for entry in feeder['entries']:
        title = entry['title']
        link = entry['link']

        context = {
        'title':title,
        'link':link,
        }

        return render(request,'index.html',context)
```

##index.htmlを書く

1件だけ表示する簡易テンプレートになっています。

```templates/index.html
{% extends "base.html" %}
{% block body %}
  <div class="container">
    <div class="row">

      <div class="col-md-6">
        {{ title }}
        {{ link }}
      </div>

    </div>
  </div>

{% endblock %}
```

データベースに入れてガンガン処理していくのも面白い予感はします。
さて、ここからが本番。
データベースに保存していきましょう。

#カスタマイズ例

DMMのアダルト動画RSSを取得してデータベースに保存したりします。

```views.py
import feedparser
import sys, codecs
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)

from django.http import HttpResponse
from django.shortcuts import (render, redirect,)
from myapp.models import Feedmodel

def index(request):
    url = 'http://www.dmm.co.jp/digital/videoa/-/list/rss/=/sort=date/'
    feeder = feedparser.parse(url)

    
    for entry in feeder['entries']:
        data = Feedmodel()
        data.title_name = entry['title']
        data.url_link = entry['link']
        data.package_img = entry['package']#パッケージサムネイルを取得
        data.save()

        all_data = Feedmodel.objects.order_by('-id')

    context = {
        'all_data': all_data,
    }

    return render(request,'index.html',context)
```

```models.py
from django.db import models

class Feedmodel(models.Model):
    title_name = models.CharField(max_length=140)
    url_link = models.CharField(max_length=140)
    package_img = models.TextField(null=True)
```

いるかどうかは微妙ですが、管理画面用。

```admin.py
from django.contrib import admin
from myapp.models import Feedmodel


class FeedmodelAdmin(admin.ModelAdmin):
    list_display = ('id','title_name','url_link','package_img')

admin.site.register(Feedmodel,FeedmodelAdmin)
```

```index.html
{% extends "base.html" %}
{% block body %}
  <div class="container">
    <div class="row">

      <div class="col-md-12">
        {% for i in all_data %}
        <div class="col-md-4 clearfix">
          <p><img src="{{ i.package_img }}"><a href="{{ i.url_link }}">{{ i.title_name }}</a></p>
        </div>
        {% endfor %}
      </div>

    </div>
  </div>

{% endblock %}
```

何に使えるのか、実用性はあるのかは不明です。
lsコマンドのオプションはどこにでも置ける

Linuxに入っているGNU Coreutils版の`ls`コマンドのオプションはどこにでも置ける、ということを、もう10年近くUNIX系OSを使っていたのにまったく知らなかった。恥ずかしい。

# 具体例
RHEL系OSでもDebian系OSでも通常はこう記載していた。

```shell-session:通常の書き方
$ ls -l testdir/
total 0
-rw-r--r-- 1 testuser ubuntu 0 Nov 18 15:44 testfile1.txt
-rw-r--r-- 1 testuser ubuntu 0 Nov 18 15:44 testfile2.txt
```

実はこういう書き方もできる。

```shell-session:オプションをディレクトリ名の後ろに書ける
$ ls testdir/ -l
total 0
-rw-r--r-- 1 testuser ubuntu 0 Nov 18 15:44 testfile1.txt
-rw-r--r-- 1 testuser ubuntu 0 Nov 18 15:44 testfile2.txt
```

ちなみに、MacOSなどのBSD系の`ls`コマンドでは、この書き方はできないようである。

```shell-session:ExitStatusはエラーで返ってくる
$ ls testdir/ -l
ls: -l: No such file or directory
testdir/:
testfile1.txt testfile2.txt

$ echo $?
1
```
メモ：Djangoでメールを送信する

#Djangoでメールを送信する

基本はこの形でいいみたい。
SMTPサーバーない場合はバックエンドに設定しておくらしいのですが、勉強中です。

```views.py
import sys, codecs
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)

from django.http import (HttpResponse, HttpResponseRedirect,)
from django.core.mail import (send_mail, BadHeaderError,)

#source virtualenv/bin/activate
def send_mail(request):
    subject = request.POST.get('subject','')
    message = request.POST.get('message','')
    if subject and message:
        try:
            send_mail(subject,message)
        except BadHeaderError:
            return HttpResponse('Error')
        return HttpResponseRedirect('index.html')
    else:
        return HttpResponse('すべての項目を埋めてください')
```
[Swift3.0]iOS・tvOSアプリで画像を扱うときは、UIImageのキャッシュに要注意


##メモリ使用量が激増！？

tvOSとiOSに対応した[浮世絵時計アプリ](http://toshi586014.net/2016/11/18/beautiful-ukiyo-e/)を開発しているときに、メモリ使用量がどんどん増えていく現象がおきて困っていました。

メモリリークしているわけではないのになぜだろう？と、いろいろ調べてみると、こちらの記事に出会いました。
[UIImage using contentsOfFile - stack overflow](http://stackoverflow.com/questions/29376520/uiimage-using-contentsoffile)

どうやら、UIImage(named: )をつかうと、自動的に画像がキャッシュされるようです。

アップルのドキュメントも調べてみると、このように書いてありました。
>Use the init(named:in :compatibleWith:) method (or the init(named:) method) to create an image from an image asset or image file located in your app’s main bundle (or some other known bundle). Because these methods cache the image data automatically, they are especially recommended for images that you use frequently.

## キャッシュしてほしくないときもある

頻繁にアクセスする画像なら、自動的にキャッシュしてくれると、読み込みが速くなるのでありがたいです。

しかし、浮世絵時計アプリは、200枚近くの浮世絵画像読み込んでいきます。それを全部キャッシュするものですから、浮世絵をひととおり表示すると、使用メモリが300MBくらいになってしまいました。

2週目からは、キャッシュがきいているため使用メモリが増えないのですが、いくらなんでも300MBもメモリをつかうのは、モバイルアプリとしては困ったちゃんです。それに、これからのアップデートで浮世絵画像を追加すると、そのたびに使用メモリが増えることになってしまいます。

## キャッシュしない方法

それでは、自動的にキャッシュをしてほしくない場合には、どうすればいいのでしょうか？

さらにアップルのドキュメントを調べてみると、キャッシュをしない場合はUIImage(contentsOfFile: )を使ってね、と書いてあります。
>Use the imageWithContentsOfFile: or init(contentsOfFile:) method to create an image object where the initial data is not in a bundle. These methods load the image data from disk each time, so you should not use them to load the same image repeatedly.

コードを書きかえて実際に試してみると、確かにキャッシュされていないようで、使用メモリがどんどん増えていくことはなくなりました。

これでバンバンザイのようですが、ひとつだけ困ったことがあります。

それは、contentsOfFileをつかうとassetカタログがつかえないのです。

![Kobito.BROmZo.png](https://qiita-image-store.s3.amazonaws.com/0/38924/dd7c01f8-20e9-97ed-5169-8ce2702f1265.png "Kobito.BROmZo.png")

アプリの仕組みとして、assetカタログをつかえなくて困ることは（いまのところは）ありません。しかし、Xcodeで画像を管理しやすいので、assetをつかいたい。でも、それだとメモリを山盛りつかってしまう。

というジレンマで悩みましたが、背に腹はかえられません。

しかたないので、imagesフォルダをつくって、そのなかに画像ファイルをいれることにしました。

![Kobito.gtN0ZA.png](https://qiita-image-store.s3.amazonaws.com/0/38924/aafc2751-5041-39e0-f962-b13004871699.png "Kobito.gtN0ZA.png")

というわけで、たくさんの画像をあつかうアプリを開発する際は、UIImageのキャッシュには十分ご注意ください。
WordPressの始め方　⑴サーバの選び方

<h3>クライアントとサーバ</h3>
Web界隈の知識を学んでいると、よく出てくる言葉が「クライアント」と「サーバ」。
そもそもこの2つの成り立ちを知っておくと便利です。

インターネットで見ることができるデータは、一体どうやって共有されているのか？
その答えが「クライアント」と「サーバ」にあります。

「クライアント」とは、PCやスマートフォンなど、
個人がWebブラウザを使ったりしてインターネットにアクセスする際に用いている端末。
これらの端末からはアクセス（ダウンロード）もできるし、データのアップロードもできます。

一方、サーバは、アップロードされたデータを貯めておく機械のこと。

「クライアント」→データ要求→「サーバ」→データ提供→「クライアント」
という流れとなっています。
クライアントがアクセスし、ダウンロードできるデータをインターネット上に公開するためには、
まずはサーバを確保する必要があります。


<h3>サーバの種類</h3>
・共有サーバ：一台のサーバを複数のユーザでレンタル。不安定だけど安い。
・仮想サーバ：一台のサーバ上に複数の仮想サーバを構築し、各仮想サーバを一人でレンタル。
・専用サーバ：一台のサーバを一人でレンタル、高い。自分で構築する場合難しい。

<h3>レンタルサーバーかクラウドか</h3>
レンタルサーバとは、その名の通り、部分的にレンタルできる他社のサーバです。
オンプレミスのように自身でサーバを購入したり、環境を整備したりする
必要がないため、資産を持ちたくない人にとって非常に便利なインフラです。

一方、クラウドは以下のサービスを包括した概念となっており、
このうち、従量制（定額制ではなく使う分だけ）で提供されるIaaSについて、
レンサバと比較されるクラウドと認識されています。
SaaS（Software as a service)
PaaS（Platform as a service）
IaaS（Infrastructure as a service）

IDCフロンティアさんの記事がとてもわかりやすいです。
https://www.idcf.jp/cloud/column/rentalserver_cloud.html

<h3>サーバ選びのポイント</h3>
（１）セキュリティ
オンプレミスでない以上、セキュリティはレンサバとクラウドでそう違いはなさそうなので、
アクセス集中でサーバ落ちがありうるメディアですとクラウドが望ましいかと思います。

（２）サーバの物理的障害対策
「サーバが落ちる」という言葉をよく聞くかと思いますが、
冗長化、二重化でほぼ防衛できているようです。

（３）ネットワーク障害対策
サーバ障害のほかにインフラを脅かすのがネットワーク障害。
電波の問題など、防ぎ難いものも多いため
別回線でつなげるように整備されているところが安心。

（４）他ユーザのアクセス
共有サーバの問題として、他ユーザが負荷をかけすぎている場合
自分の環境にも影響を及ぼす可能性があることが挙げられます。

<h3>レンタルサーバ</h3>
おすすめは「さくらのレンタルサーバ」。
Q&Aへのアクセスがしやすく、画像でのアナウンスが多い、
わかりやすいUIです。

<H4>WordPress専用サーバ</h4>
WordPress専用にチューニングされているレンタルサーバ。
X serverなど。

<h3>クラウド</h3>　
Amazon web service
Microsoft Azure
Google Cloud Platform
IBM Softlayer

<h3>メディアの規模別サーバの選び方</h3>
基本的には
個人メディアやStartupの当初サービスページ、LP（ランディングページ）程度なら
レンサバで開始し、PVが集まってきたり、キャンペーンを打つようになってきたら
クラウドへ移行するのが、コスト・運用レベル的に良いようです。
yarn global addしたパッケージのパスを通す

`yarn global add`しても自動でパス通してくれないっぽい[バグ](https://github.com/yarnpkg/yarn/issues/1585)があるようで

```sh
$ yarn global add create-react-app
$ create-react-app
zsh: command not found: create-react-app
```

ってなったので~/.zshrcに以下を追加しました。

```.zshrc
export PATH="$PATH:`yarn global bin`"
```

もう一回やってみると行けます。

```
$ create-react-app
Usage: create-react-app <project-directory> [--verbose]
```

`yarn global`には結構バグがあるっぽいので早く安定してほしいですね。
MacからRDP接続したwindows上のvirtualboxにてキー入力に問題がある場合の回避策

## 問題点

Macからwindows10にRDP接続して
windows上のvirtualbox で動いている centosを操作する場合、

* `_` や `|` が入力できない。
* Androidからだとそもそも文字が何も受け付けない。

(VMWarePlayerでも同現象。)

## 回避方法

centosでVNCサーバー(vino)を起動
MacからcentosにVNC接続すれば `_`や`|`が入力できる。

また、`Command+Tab`が`Alt+Tab`になってくれてるのも嬉しい。

```rb
xrandr --output VGA-0 --mode 1920x1080
```

なお、日本語入力は`Control 押しながら 2`などに割り当てています。

![Screenshot-IBus の設定.png](https://qiita-image-store.s3.amazonaws.com/0/25728/e6255ae4-75ea-97f3-b13d-e47b75d99c0a.png)
rails5でgemのcabochaを使おうとするとエラーになる

## 環境

AWS EC2
Ruby 2.3.1
Rails 5.0.0.1

## エラー内容
unicornを起動しようとすると次のようなエラーで起動することができませんでした。

```
LoadError: libcabocha.so.5: cannot open shared object file: No such file or directory - /home/ec2-user/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/cabocha-0.69.1/lib/ca
bocha/CaboCha.so
```

## 対応したこと
### とりあえずfindコマンドで検索
```
$ find / -name libcabocha.so.5 2>/dev/null
/usr/local/lib/libcabocha.so.5
```
存在を確認。

### エラーが起きたファイルでロードされているライブラリを確認
```
$ ldd /home/ec2-user/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/cabocha-0.69.1/lib/cabocha/CaboCha.so 
	linux-vdso.so.1 =>  (0x00007fff77a6a000)
	libcabocha.so.5 => not found
	libcrfpp.so.0 => not found
	libmecab.so.2 => /usr/lib64/libmecab.so.2 (0x00007fdb28e16000)
	libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fdb28b11000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fdb288f4000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007fdb286f0000)
	libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fdb284b9000)
	libm.so.6 => /lib64/libm.so.6 (0x00007fdb281b6000)
	libc.so.6 => /lib64/libc.so.6 (0x00007fdb27df4000)
	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fdb27bde000)
	/lib64/ld-linux-x86-64.so.2 (0x000055a5f1199000)
	libfreebl3.so => /lib64/libfreebl3.so (0x00007fdb279db000)
```
libcabocha.so.5とlibcrfpp.so.0がnot foundになっていましたのでロードに失敗しています。

### /etc/ld.so.confに/usr/local/libを追記
`/etc/ld.so.conf`はライブラリをロードするときに参照するディレクトリを設定するファイルです。
デフォルトでは

* /lib
* /usr/lib
* /etc/ld.so.confに記述されたディレクトリ

を参照すのですが、`/usr/local/lib`が含まれていません。
`/etc/ld.so.conf`に`/usr/local/lib`を追記します。

### ライブラリの依存関係情報を更新する
`ldconfig`コマンドを叩いてライブラリの依存関係を更新します。
このコマンドを叩くと`/etc/ld.so.cache`が更新されます。

### libcabocha.so.5がロードされているか確認
もう一度`ldd`コマンドでライブラリがロードされているか確認します。

```
$ ldd /home/ec2-user/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/cabocha-0.69.1/lib/cabocha/CaboCha.so
	linux-vdso.so.1 =>  (0x00007ffcdd569000)
	libcabocha.so.5 => /usr/local/lib/libcabocha.so.5 (0x00007fcb1fd49000)
	libcrfpp.so.0 => /usr/local/lib/libcrfpp.so.0 (0x00007fcb1fb02000)
	libmecab.so.2 => /usr/local/lib/libmecab.so.2 (0x00007fcb1f73a000)
	libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fcb1f435000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fcb1f218000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007fcb1f014000)
	libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fcb1eddd000)
	libm.so.6 => /lib64/libm.so.6 (0x00007fcb1eada000)
	libc.so.6 => /lib64/libc.so.6 (0x00007fcb1e718000)
	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fcb1e502000)
	/lib64/ld-linux-x86-64.so.2 (0x0000558070ff3000)
	libfreebl3.so => /lib64/libfreebl3.so (0x00007fcb1e2ff000)
```
`libcabocha.so.5`が参照できていることが確認できました。
`libcrfpp.so.0`も同じ場所にあったみたいです。
unicornも無事に起動することができました。


## まとめ
パスが通っていないので環境変数PATHに`/usr/local/lib`を追記したりしましたがうまくいかなかったです。
PATHはコマンド実行時に参照するものであって、ライブラリのロード時に参照されるものではないということがわかっただけでもいい勉強になりました。
#12 【攻略】RubyWarrior Level3 ~中級編~

RubyWarrior Level3中級編の攻略です。
条件分岐が初級編よりも多くなって、スクリプトが複雑になってきました。

#概要
初手で敵3体に囲まれてます。このままだと物量的に負けるので新スキルwarrior.bind!で敵を捕虜にして足止めしましょう。

ルックスは普通の捕虜と一緒なのですがしっかりと最後はwarrior.attack!で倒しましょう。

#スクリプト

```
class Player
  def play_turn(warrior)


    #周囲に敵がいるかの判定
    def enemy_there?(warrior)
      if warrior.feel(:left).enemy?
        return :left
      elsif warrior.feel(:right).enemy?
        return :right
      elsif warrior.feel(:forward).enemy?
        return :forward
      elsif warrior.feel(:backward).enemy?
        return :backward
      else
        return :none
      end
    end


　　 #周囲に捕虜がいるかの判定
    def captive_there?(warrior)
      if warrior.feel(:left).captive?
        return :left
      elsif warrior.feel(:right).captive?
        return :right
      elsif warrior.feel(:forward).captive?
        return :forward
      elsif warrior.feel(:backward).captive?
        return :backward
      else
        return :none
      end
    end


　　 #実際の行動のロジック
    dir = enemy_there?(warrior)
    case dir
    when :left, :forward, :backward
      warrior.bind!(dir)

    else
      if warrior.health < 10 
        warrior.rest!

      else
        dir = captive_there?(warrior)
        case dir
        when :left, :forward, :backward
          warrior.attack!(dir)
        when :right
          warrior.rescue!(dir)

        else
          dir = warrior.direction_of_stairs
          warrior.walk!(dir)
        end
      end
    end
  end 
end
```

メソッドに敵と捕虜がいるかの判断を任せられたので、ちょっと短くなった。
ただcase文とif文が混ざっているのでちょっと見づらい。


#解説
行動のロジックの流れとしては、
①まず周囲に敵がいたら優先してwarrior.bind!する。
②全部の敵を一旦捕虜にした後、敵の捕虜と味方の捕虜を区別してwarrior.attack!とwarrior.rescue!を実行させる。
③場が綺麗になったら後は階段の方向へ進む。

②がちょっと注意で、最初のターンで敵から3方向からボコボコにされる+bindした後に攻撃すると反撃されてbindが解かれる。

なので、体力回復のロジックをbindするロジックの中に入れてあげないと、敵の攻撃量に追いつかず負ける。
こんな感じにしないといけない。

```
dir = enemy_there?(warrior)
case dir
when :left, :forward, :backward     #何はともあれ最初はwarrior.bind!で捕虜にする
  warrior.bind!(dir)              

else
   if warrior.health < 10 　　　　　　#ちゃんと敵を檻にに収めてから回復しましょう
     warrior.rest!
・
・
・
```

コード書いてるのにゲームみたいで結構楽しい。
Caffeをcmakeで入れなおす

##はじめに
以前、ubuntu14.04にmakeでCaffeをインストールした。
http://qiita.com/masataka46/items/ac22818aac89f9c9dd0e
しかし、cmakeを使っていないために`CaffeConfig.cmake`などが生成されず、そのようなファイルが必要なモデルを走らせる時に問題が生じた。
http://qiita.com/masataka46/items/df3b9aba6fa7dc6bbff5
そこで、改めて別のディレクトリにcmakeを使ってCaffeをインストールしてみる。

Caffeの公式ドキュメントのCmake buildの部分に従って進める。
http://caffe.berkeleyvision.org/installation.html#compilation

##環境
Ubuntu14.04
GPU:GTX1070
CUDA:8.0 RC
cuDNN:5.1
Caffeはmakeでinstall済み
　・・・よってcaffeをインストールするためのrequirementsはひと通りある
##CaffeをCmakeでbuildする
まずgit cloneしてくる。

```
git clone https://github.com/BVLC/caffe.git
```

次に公式ドキュメントに従ってCmakeでbuildする。

```
cmake .
make all
make install
make runtest
・・・・・
・・・・・
[----------] Global test environment tear-down
[==========] 2085 tests from 277 test cases ran. (274950 ms total)
[  PASSED  ] 2085 tests.
[100%] Built target runtest
```

ひと通りruntestに成功したようだ。`CaffeConfig.cmake`や`caffe-config.cmake`はCaffeの直下に作成されている。
##PythonでCaffeを使えるようにする。
以下のサイトを参考にした。
http://qiita.com/TD72/items/bcb243ee02760ea1d8bb

```
sudo apt-get install python-dev python-pip python-numpy python-skimage gfortran
sudo pip install -r ~/caffe/python/requirements.txt
make pycaffe
```

次にパスを通す。bashに以下を追加。

```
export PYTHONPATH=/home/ohmasa/work/caffe/build/caffe/python/:$PYTHONPATH
```

以下で確認。

```
python
>>>import caffe
```

問題なくcaffeが読み込まれたので、成功。
poweful postgresql

https://www.rails365.net/articles/postgresql-de-array-he-hstore-lei-xing-jiu

https://www.rails365.net/articles/postgresql-de-ltree-cha-jian-qi

https://gist.github.com/Randommood/1478360

https://www.postgresql.org/docs/9.1/static/view-pg-available-extensions.html
RailsのログからSQLクエリを抽出してデータベースに入れ直すスクリプト

泣きながら書いたのでメモ。

* Railsのログから `INSERT` と `UPDATE` を抜き出して実行します。他は不要だったので手をつけていません。

```ruby
require 'active_record'

ActiveRecord::Base.establish_connection(
  adapter:'sqlite3',
  database:'target.sqlite3'
)

def execute_with_params(sql, params = [])
  sql = ActiveRecord::Base.send(:sanitize_sql_array, [sql, *params.to_h.values])
  ActiveRecord::Base.connection.execute(sql)
end

while line = gets&.gsub(/\x1B\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]/, '')
  case line
  when /INSERT/
    turai = line.scan(/^., \[.+\] DEBUG -- :   SQL \(.+\)  (.+VALUES \(.+\))  (.+)$/).flatten
    sql = turai[0]
    params = eval(turai[1])
    execute_with_params(sql, params)
  when /UPDATE/
    turai = line.scan(/^., \[.+\] DEBUG -- :   SQL \(.+\)  (.+)  (.+)$/).flatten
    sql = turai[0]
    params = eval(turai[1])
    execute_with_params(sql, params)
  else
  end
end
```
UI > 迷うUI > アクション / 現状の表示

UIを作る時、以下のいずれなのかを考える。

- アクション
- 現状の表示

例として「再生をするための」ボタン

- アクションとしての「再生」
  - ボタンを押すと再生する
- 現状としての「再生」
  - 現在再生中、を表す
  - マウスオーバーすると「停止」ボタンが見える、などの工夫をしたりする

UIを実装するときに、この二者が混在するインタフェースにしてしまうと使いにくいと思う。

QiitaのUIはどうなのだろうか?

- いいね
   - アクション
- チェック付いいね
   - 不明
- トップページのフィード記事ごとの下ボタン
   - アクション
   - 押すと記事が展開する
- [html5のサマリ表示](http://qiita.com/7of9/items/fc72e36ee58ec10c13f8) > 右向き三角
   - 不明. 意味が取りにくい。
- html5のサマリ表示 (展開後) 下向き三角
   - 現状: 展開をした、という意味
- ストック(チェックなし)
   - アクション
- ストック(チェック付)
   - 現状: (ストック済み)
   - 押すと解除、という意味は学習することになる


YoutubeとAppleTV ( Hulu? )などを使っていて「アクションと現状」の違いがあり、気になったのが調べたきっかけ。

### link

関連記事へのリンク

状態か機能かわからないトグルボタンの改善
http://qiita.com/ln-north/items/00367953baa0fb517f71
TestLinkを bitnami で Windows にインストールしてみる

bitnami（ビットナミ / ビットナミー）は、Webアプリケーション環境、
例えばPHPとかMySQL等の必要な設定をまとめて簡単に構築できる素敵ソフト（らしい）。

この bitnami を利用して、ローカルPCに TestLink をインストールしてみました。
> TestLinkはPHPで作成されたオープンソースのWebベーステスト管理システムである。
> TestLink単体でも動作可能だが、MantisやJIRA、Bugzilla,Trac,Redmine、FogBugzなどのバグトラッキングシステムと連携可能である。
> バージョン1.7.0から日本語対応。
 - [Wikipedia](https://ja.wikipedia.org/wiki/TestLink)


# 手順
### bitnami testlink stack のダウンロード
1. bitnami（ https://bitnami.com/stack/testlink/installer ）にアクセス。
2. 「download」をクリックしてインストーラをダウンロード。  
※ bitnami にログインしていないと、ログインを促すダイアログが表示されるが、  
ダイアログ左下の「No thanks, just take me to the download」をクリックすればダウンロードできる。  

### bitnami testlink stack のインストール
1. ダウンロードしたEXEファイルを実行
2. 言語選択がでるので、English を選択した。
3. ウィザード
   - Setup - Bitnami TestLink Stack => そのまま 次へ
   - Select Components => そのまま 次へ
   - Installation Folder => インストール場所を指定して 次へ
   - Create Admin Account => testlink のアカウント設定を入力して 次へ
   - Configure SMTP Settings => チェックを外して 次へ
   - Deploy TestLink to the Cloud in One Click => チェックを外して 次へ
   - Ready to Install => 次へ => インストール実行

### TestLink へログイン
1. インストールが完了したら、bitnami testlink を ローンチ
2. ブラウザページが開いたら、「Access Testlink」をクリック
3. TestLink のログインフォームに、インストールウィザードで設定したアカウント情報を入力してログイン
4. 完了


以上の手順で完了。本当に簡単。
0で割る

０で割った時にどうなるのかをいくつかの言語で実験。

[paiza](https://paiza.io/projects/new)で試してみる。

今回は1 ÷ 0をPHP, JavaScript, ruby, Java, Python3, Swiftで試してみました。
上記６つの言語を選んだ理由は特にありません。

#### PHP

```php
print_r(1 / 0);
```
=> PHP Warning:  Division by zero

#### JavaScript

```js
console.log(1 / 0);
```
 => Infinity
 
#### ruby

```ruby
print 1 / 0
```
=> divided by 0 (ZeroDivisionError)

#### java

```java
public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println(1 / 0);
    }
}
```
=>  Exception in thread "main" java.lang.ArithmeticException: / by zero at Main.main(Main.java:5)

#### Python3

```pytb
zero = 1 / 0
print (zero)
```
=> ZeroDivisionError: division by zero

#### Swift
```swift
print(1 / 0)
```
=> error: division by zero

### まとめ
基本的にはゼロ除算エラー(division by zero)になりました。
PHPがwarning、JavaScriptに関してはInfinityとwarningすら出ませんでした。
あらたにELBを作成する時の、CloudWatch設定メモ

# やりたいこと
ELBを作成するにあたり、CloudWatchで監視をしたい
特に5XXエラーとか出たら、通知が欲しい

# 課題
発生した事のないメトリックスは、画面上からは設定できない

# 解決方針
a). 無理やり5XXを発生させる
b). コマンドラインで設定（コマンドラインなら設定可能）

a)は ( `_ゝ´) という表情になるので、b)を実施。
まぁ、どのみち5XX以外も複数個設定する訳だし。

# コマンド
以下は
> 1 分間 に対する HTTPCode_Backend_5XX (HTTPCode_Backend_5XX) >= 1

を設定する例。【★】は書き換える。

```
aws cloudwatch put-metric-alarm \
 --alarm-name "【★】" \
 --alarm-description "【★】" \
 --metric-name HTTPCode_Backend_5XX \
 --namespace AWS/ELB \
 --statistic Sum \
 --period 60 \
 --threshold 1 \
 --comparison-operator GreaterThanOrEqualToThreshold  \
 --dimensions "Name=LoadBalancerName,Value=【★】" \
 --evaluation-periods 1 \
 --alarm-actions 【★】 \
 --unit Count
```

|項目名|備考|
|:--|:--|
| --alarm-name |通知メールのsubjectにも入る。| 
| --alarm-description |通知メールのbodyにも入る。|
| --metric-name |[この辺](http://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/elb-cloudwatch-metrics.html)から探す |
| --namespace |今回はAWS/ELB。 [この辺](http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/aws-namespaces.html)から探す。 |
| --statistic | |
| --period |  |
| --threshold | 5xxエラーは出ない前提で作っているので1に。 |
| --comparison-operator | 1"以上"にしたいのでGreaterThanOrEqualToThreshold |
| --dimensions | [この辺](http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/elb-metricscollected.html)を参照。ELBの場合、 Name=LoadBalancerName となるようす。|
| --evaluation-periods | thresholdと同様の理由で1 |
| --alarm-actions |飛ばしたいメールのTopicを書く。|
| --unit |今回のケースはCountで良さそう。|


コマンドを実行すると、割とすぐ反映された。


# 残課題
そのアラームが正しく機能するか（＝設定を間違えていないか）どうかのスマートな確認手段。



# 参考
http://docs.aws.amazon.com/cli/latest/reference/cloudwatch/put-metric-alarm.html
datadogで単一のアカウントで複数組織をスイッチする

複数サービスの運用をしていると複数のdatadogチームを作りたくなります。

そんな時には以下の方法でダッシュボード上からチームを切り替えできるようになります。

1. 既存のアカウントとは別のメールアドレスでチームを作る
2. 1.で作ったチームから既存のアカウントのメールアドレスを招待する
3. 招待メールをぽちる
4. 既存のアカウントでログインするとメニューにチームをスイッチするUIが表示されます
IntelliJ Ideaでインポートのワイルドカードを無効化する

##はじめに
IntelliJのバージョンを最新の2016に上げたところ、でJavaのimportをIntelliJに行わせようとすると(`option` + `return`)、ワイルドカードでインポートされるようになってしまった。
コードレビューで指摘を受けてしまった。

```java
import java.util.*;
import java.util.stream.Collectors;
```

##ワイルドカードを使わないようにする方法

以下を参考にしました。
http://stackoverflow.com/questions/3348816/intellij-never-use-wildcard-imports

`Preferences` -> `Editor` -> `Code & Style` -> `Java`
でJavaコードスタイルの設定ページを開く。

`Imports`タブを開くと、以下のような設定画面が表示される。

![スクリーンショット 2016-11-18 12.53.59.png](https://qiita-image-store.s3.amazonaws.com/0/24467/4469fa46-1958-88a6-9585-e3d932205deb.png)


ワイルドカードを使わないようにするには、以下の3点を設定する。

- Use single class importにチェックを入れる
- Class count to use import with '*': を999などの大きな値にする
- Names count to use static import with '*': を999などの大きな値にする

これでワイルドカードでのインポートがされないようになりました:hammer_pick:
kintone.events.on をハックする

#kintone使ってますか？
俺はけっこう使ってます。
みんなも使ったら良いじゃない。そしてプラグインを買ったらいいじゃない。~~（まだうちのリリースしてないけど……）~~ 
（リリースしました！ よろしくお願いします）→[『機能拡張スタンダード All-In』](https://spica.tokyo/bluelaunch)

kintoneでスクリプトを書いてると湧き上がってくる疑問のひとつに……
「ユーザー環境ではどこでイベントのオブジェクトが書き換えられてるかわかったもんじゃねーな」
があります。

地味に困るのは<b>”フィールドにエラーを表示させるとそれまで変更した内容が全て無効化される”</b>という点。
「ちまちま書き換えた内容が一瞬でパーなんじゃああああああ！」とばかりの結果になります。
<b>「フィールドにエラー吐いてほしくないんじゃあああああ！」</b>


##実はいまですね
<b>条件書式</b>とか<b>自動計算</b>とか<b>フィールドの入力値からテキスト自動生成</b>とか、その他もろもろの基本的な機能拡張をゴリっとまとめた<b>プラグイン</b>を最終デバッグ中です。
これらの機能はまとめておいた方がたぶん作る方も使う方も楽です。もうすぐリリース予定なのでその時はよろしくお願いします。

##それはさておき
機能をモリモリと実装してる時に自動計算とエラー判定が競合して困ったのですよ。いやーあれは困った。半日くらい悩んでた。

これは対処のしようが無いです。サイボウズ様のご沙汰ですから。ええ、<b>普通ならな</b>。
普通じゃない（サイボウズが絶対に推奨しないであろう）方法ならある。

その方法とは<b>「せっかくだから俺はこのkintone.events.onを書き換えるぜ！」</b>というもの。
なんとこのfunctionってconfigurableなのですね。（きっと「上書きしていいよ♪」というサイボウズの中の人の温情ですねこれは。うむ間違いないｗ）

そんなわけでちょっと書いてみました。
小一時間で急いで書いたものなので、最低限の動作テストはしたけど例のアレな感じです。「使ってみて何か酷い目にあっても知らんよ」と言っておきます。サーセン。ここは概念を学ぶためのインターネッツですｗ
ちょっと思いつくとこだと、falseを返したい場合とかに対応してないのでdelete.submitとかが絶対にキャンセルされなくなる。あとkintone.Promise返したいのとかね。要するに何を返したかったのかちゃんと見て調整しないとまるっきり同じというわけには行かない感じですか。
<b>テストはとても大事</b>。

#ぶっちゃけコードはこんな感じです
```ruby:はぢめてのkintone.events.on
(function(){
	//private的なものども
	var refOriginalEventsOn = kintone.events.on; //ガチで上書きしちゃうわけないのでとりあえず退避的な
	var Events = {}; //コールバック退避用的な

	//それじゃあ遠慮なく書き換えさせてもらいやすぜサイボウズの旦那
	kintone.events.on = function(_events, _callback){

		//引数の補完と型保証をします的な
		if(typeof _events === "string"){ _events = [_events]; }
		if(!(_events instanceof Array) || (typeof _callback !== "function")){ return false; }

		//指定のイベントトリガーで走査して個別に設定するよ的な
		for(var i=0; i<_events.length; i++){
			
			//コールバック退避用のオブジェクトのキーにイベントトリガーがまだなければkintone.events.onに設定するよ的な
			if(!Events.hasOwnProperty(_events[i])){
				Events[_events[i]] = [];

				//kintoneイベントに登録しますわ的な
				//※ refOriginalEventsOnは元々のkintone.events.onを参照してます
				refOriginalEventsOn(
					_events[i],
					function(event){
					
						//はいここテストに出ます
						//Eventsには kintone.events.on で呼ばれるfunctionが入ってます。
						//そいつを参照して実行してるので、あとから追加しても問題なく呼ばれるというすんぽうです。
						//まあ難しい話ではないですな。

						var fn = Events[event.type] || [];
						for(var i=0; i < fn.length; i++){
							fn[i](event); //ちゃんとやりたいヒトはこの戻り値を受け取っていろいろ対処する
						}

						//唯一の return event となるわけなんだなこれが
						return event;
					}
				);
			}

			//はいここもテストに出ます
			//というか対になってるとこですね。ここに追加するとあとで参照実行されます。
			Events[_events[i]].push(_callback);
		}
	};
})();
```

##さてこのスクリプトをどこに置いたものか……
当然、他の処理が走る前ですわな。
kintone.events.on を書き換える前に設定されたものは触れることができません。
    1. kintone全体のカスタマイズ
    2. アプリのカスタマイズ
    3. プラグイン
<b>さあどれだ！？</b>
プラグイン化は論外ですかね。意味ナス。
じゃあ<b>せっかくだから</b>kintone全体にぶちかましますか！
いやいや。そんなクソ度胸いらんわ。心臓が毛むくじゃらでも情シスは尊敬してくれねーぜってな。
実はこの順番はいま（2016/11/18）確かめてみたところkintoneがスクリプトを読み込む順番なんですな。この仕様はどっかに書いてあるのかな？
プラグインが複数入ってる場合にそのなかでの順番がどうなるかはよく調べてないけど、たぶん調べる意味はないのでほっときます。
たぶん大事なのは<b>プラグインより先に入れること</b>です。

##イベントトリガー丸裸！
これをやっとくとですね、ブラウザのデベロッパーモードとかでプラグインがどんなイベントトリガーをフックしてるのかゴンヌズバーと見れちゃうのですよ。
あとね、
``` return event; ```
の前に、eventの中身を調整することも当然できるわけです。
冒頭で吠えた問題点、
<b>「フィールドにエラー吐いてほしくないんじゃあああああ！」</b>
がなんと解決できる、とこういうわけです。

これにてハック終了、かどうかはわかりませんが。
そんな感じでーす。
【Ruby on Rails】「正規表現でマッチするものを取得」したい。

#「正規表現でマッチするものを取得したい。」
- ログから必要な部分だけ抜き出したい...
- けど正規表現で一気に書くのって面倒臭い...

<例> /([\d\.]+) \- \- \[([^\]]+)\] "[A-Z]+ .*.+ HTTP\/[\d\.]+" (\d+) .+ \d+ "[^""]+" "[^""]+"/

**こんな暗号どうやって紐解けばいいんだよ...**


#って事で始めるよ
##【手順①】欲しい部分をピックアップ
```log:sample.log
127.0.0.1 - - [18/Nov/2016:10:20:30 +0900] "GET /dummy/aaa/ HTTP/1.1" 200 12345 67890 "-" "Java/1.7.0_79"
~~~~~~~~~     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~                            ~~~
  └>IPアドレス      └>日時                                           └>ステータスコード
```
こんなログがあるとして、
その中から今回は**「IPアドレス」「日時」「ステータスコード」**を取得してくる事とします。

##【手順②】欲しい数だけ () を用意
```ruby:reg.rb
/() () ()/
```
今回は3つなのでこんな感じ。


##【手順③】 () の中や外に正規表現を書いていく
```ruby:reg.rb
/([\d\.]+) \- \- \[([^\]]+)\] "[A-Z]+ .*.+ HTTP\/[\d\.]+" (\d+) .+ \d+ "[^""]+" "[^""]+"/
#~~~~~~~~~        ~~~~~~~~~~                             ~~~~~~~
```
- Point
    - 欲しいところは()で括る
    - 要らないところも正規表現で書く

##【手順④】動作確認
```ruby:reg.rb
log = '127.0.0.1 - - [18/Nov/2016:10:20:30 +0900] "GET /dummy/aaa/ HTTP/1.1" 200 12345 67890 "-" "Java/1.7.0_79"'

if str = log.match(/\A([\d\.]+) \- \- \[([^\]]+)\] "[A-Z]+ .*.+ HTTP\/[\d\.]+" (\d+) .+ \d+ "[^""]+" "[^""]+"/)
  puts str[1]  # => 127.0.0.1
  puts str[2]  # => 18/Nov/2016:10:20:30 +0900
  puts str[3]  # => 200
end
```
実際に動かして、取得できるか見てみよう。

<br />
以上


## 【補足①】
正規表現が正しいのか、どうなってるのか分からない時はこれを使おう。
　https://regexper.com/
可視化してくれるからオススメです。是非。

##【補足② 2017/02/20】
プログラム言語によって、使用されている**正規表現エンジン**が異なります。
**Rubyの場合は上記で上手くいくけど、他の言語だと上手くいかない事もあるので、注意しよう！！！**
ValidなHTMLでHello Worldコードゴルフ

[W3C Validator](https://validator.w3.org/)でValidなHTMLで、
Hello Worldを一番短く書くには、と疑問に思ったので紹介します。

愚直に書くとこれがほぼ最小だと思うでしょう。

```html:hello-world--normal.html
<!DOCTYPE html>
<html>
  <head>
    <title>b</title>
  </head>
<body>
  Hello, world!
</body>
</html>
```

しかしなんと、[こちらの記事](http://qiita.com/wadako111/items/7100c02337f14df07205)によると、
`html` 、 `head` 、 `body` などのタグは省略できるようです。

それで最小まで削ったのがこちら。

```html:hello-world--short.html
<!DOCTYPE html><title>b</title>Hello, world!
```

`title` だけは必須、スペースも駄目みたいなので、適当な文字を入れてます。

これで見事No errorsです！

![hello-world--short.png](https://qiita-image-store.s3.amazonaws.com/0/6117/706853f8-a18c-650d-1d9a-7eb2e2951932.png)


## 次点

上記の方法を知る前に試行錯誤してて、
titleタグに何か入れないと怒られるので、有効活用しようと書いたのが以下。

```html:hello-world--display-block.html
<!DOCTYPE html><title>Hello, world!</title><style>head,title{display:block}
```

実は `head` の要素も `display: block` にすれば表示できるんですよね〜。
composerがContent-Length mismatchでエラーが出たときの対処法

忘備録

------------------- ↓ 余談はここから ↓-------------------
ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

----

```shell-session
$ composer.phar require behat/behat

  [Composer\Downloader\TransportException]
  Content-Length mismatch

```

なんやこれ・・・。


------------------- ↓ 本題はここから ↓-------------------
ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

----

composer.jsonにrepositoriesを追加する。

```json:composer.json
{
    "repositories": [ { "type": "composer", "url": "https://packagist.org" }, { "packagist": false } ],
    "require": {},
    "config": {
        "bin-dir": "bin/"
    }
}
```


------------------- ↓ 後書はここから ↓-------------------
ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

----
Android StudioとIntelliJ IDEAのエディタが重すぎる人はPower Save Modeを使おう

とにかくCPUを使いまくってIntelliJ IDEAやAndroid Studioが遅い人はインスペクションなどの一部の機能を切り捨てることでエディタを高速化できるようです。

Power Save Modeという機能です。

有効にするには右下のこのおじさんをクリックして「Power Save Mode」をチェックします。
<img width="125" alt="スクリーンショット 2016-11-18 13.07.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/6571/b46d745d-c326-b423-ead1-fe08538c1458.png">

このおじさんはHectorおじさんいうらしいです。

自分のプロジェクトは静的型付け言語で依存ライブラリが多いせいかMac Book Proでも遅くて仕方な状況でしたがこれでひとまず解決しました。

コード補完やインポートなどもショートカットで対応するようにして、ときどきチェックのためにPower Save ModeをOnにしています。

# 参考
Android Studio最速入門～効率的にコーディングするための使い方
http://gihyo.jp/dev/serial/01/android_studio/0014
Unity Font を AssetBundle 化してアプリに含めない(バンドルしない)実験

Dinamic Font を前提にしたアウトラインデータ Font を対象に話ます。 

#まず最初に
Font にはライセンスがあります。 
PC に入ってるからと言って、勝手にアプリに使ってはいけない場合があります。 
業務でアプリを作っている方(個人でも！)は特に意識しましょう。 
デザイナーさんから、プランナーさんから渡されたから使用してるって方は、ライセンスはクリアしてる？
ってのを意識してみましょう。

Font データを扱う投稿なので、意識高い系を装って前文を書いてみました（笑）

#今回は Free Font を個人で実験
商業 Font をライセンス(アプリ埋め込み＆配布可能)購入していても、AssetBundle で DownLoad 可能にするのは
そもそも認められていない可能性が高いので、お仕事で実行に移したい！って方は確認をお勧めします。

#経緯
日英中韓などの言語(UI含む)切り替え設定ありアプリを開発するには？
ってのが始まりです。
日本語 Font ならアスキーは入ってるでしょうから日英はクリアー出来たとしても
繁体字、簡体字やハングルなどは別データとなっていて容量も大きいのがネックです。
さらに仕事だと、知らぬ間に上層部やPやDなどは世界主要言語をカバー！
とか言い出す処か、決定してたりします（笑、、えるのか？）

じゃ、設定切り替えたら DownLoad するようにすれば？から始まりました。
で色々と調べてみると、AssetBundle の Variant を使って Text(string)データが違うリソースを切り替える方法
とかヒットするんですが、どこにも Font リソース自体をアプリ外だしって内容が見つからないんです。

#結論
最初に言ってしまえば、力業で実験は成功しましたが、スマートでは無いし、
商業規模のプロジェクトで作業化するには厳しい内容だと言わざるを得ませんでした。
なにより Unity の動作的に保障されるのか？ってのもあります。

#やり方
UnityEditor作業
1)
まず Asset Bundle Manager を利用して、Local Asset Bundle サーバーで実験しました。
（シミュレートはオフ）

2)
普通に Unity に Font をインポートさせて、Scene でも Prefab でも UI.Text でデータを作ります。

3)
インポートしている Font リソースを AssetBundle 化します。
そしておもむろに Projectインスペクタより Font リソースを Deleta します。
当然 UI.Text の Font メンバは Missing になります。しかし text 内容やアライメント設定や位置情報は残っています。

アプリ実行中処理
1)
アプリで AssetBundle 化した Font を DownLoad します。
型としては UnityEngine.Font になると思います。

2)
Scene でも Prefab でも UI.Text が必要なタイミングで UI.Text を取得します。
今回は FindObjectsOfType で UI.Text[] を取得しました。
インスタンス化した UI.Text.font メンバは Missing どころか None になっています、、

3)
そしておもむろに UI.Text.font メンバに DownLoad した UnityEngine.Font class を代入します。

**以上！**

#問題点
いろいろと突っ込み処満載ですが、、、

まず、Font リソースを Delete してる時点で meta ファイル(GUID)も消えてしまうので
Unity さんに Missing 状態を回復するヒントすら残せません。

さらに UnityEditor で手動で削除って(笑)
これは CL Build する際に指定する static メソッド内に AssetDatabase.Delete とか記述とかしないとなんですが
実験なんで、その辺の業務に耐える手法的な部分はご容赦を。

そして極め付けは、UI.Text.font メンバに代入する！！！

* １：Font が複数種類あったらどうするの？
* ２：Scene とか Prefab なんて色んなタイミングでインスタンス化するんですけど？
* ３：おいおい UI.Text.text データは残るって言うけど、Font 変えたんだから string 情報も変えないとだろ？

はい、ご容赦出来ない業務で実用に耐えるようにするにはクリアしないとダメな内容が盛りだくさんです。

まず１から
これは UI.Text の name に判別できる名目規則をつけるとか FontSize とかで一律決めの Font にする
とかのルール＆適応処理を作るしか思いつきません。

次に２
これも Scene をロードしたら ＆ Prefab をインスタンス化したら
それらを対象にした全ての UI.Text を何らかしらの手段で取得する仕組みを実装する位しか思いつきません。
(嫌われものの FindObjectsOfType も初回一回だけならアリかと)

３ですがこれは意外に解決できそうです。
サーバ側かアプリローカル(YAMLとか)に対応する文字列を用意して、言語設定により使用する string 情報を変更する処理
前提で UI や画面をレイアウト込(文字数変わる前提)で作れば良いのです。

、、ん？それが超大変ですと！？
いやいやいや、複数言語対応をしたいのはご自身でしょ？ 別に Unity が機能をうたって売りにしてる訳じゃないのです！
そのくらいはクリアして実装しないと実現出来ませんよ。

、、でも文字数変わるとけど同一レイアウトって実は超ムズです。
世の中的には国が変わると UI(そもそもアプリ) 変えるって手法なのが理解できた実験でした。
Dockerコンテナに入れたRubyで、Encoding::InvalidByteSequenceError

Dockerコンテナに入れたRubyで、下記のようなエラーが出た。

```
Encoding::InvalidByteSequenceError: "\xE3" on US-ASCII
/app/vendor/bundle/ruby/2.2.0/gems/json-1.8.3/lib/json/common.rb:155:in `encode'
/app/vendor/bundle/ruby/2.2.0/gems/json-1.8.3/lib/json/common.rb:155:in `initialize'
/app/vendor/bundle/ruby/2.2.0/gems/json-1.8.3/lib/json/common.rb:155:in `new'
/app/vendor/bundle/ruby/2.2.0/gems/json-1.8.3/lib/json/common.rb:155:in `parse'
/app/lib/app/base.rb:26:in `initialize'
bin/app:49:in `new'
bin/app:49:in `<top (required)>'
```

Dockerfileはこんな感じ。

```bash:Dockefile
FROM ubuntu:14.04

RUN sed -i -e 's/\/\/archive.ubuntu.com/\/\/ftp.jaist.ac.jp\/pub\/Linux/g' /etc/apt/sources.list
RUN apt-get -y update && apt-get install -y wget gcc

RUN apt-get install -y \
    build-essential \
    libffi-dev \
    zlib1g-dev libssl-dev libreadline-dev libyaml-dev libxml2-dev libxslt-dev \
    sqlite3 libsqlite3-dev

RUN cd /tmp && \
    wget https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.6.tar.gz && \
    tar xzf ruby-2.2.6.tar.gz && \
    cd ruby-2.2.6 && \
    ./configure && make && make install
RUN gem install bundler

CMD bundle exec ruby
```

エラーの内容から、文字列をASCIIで解釈しようとしているので、下記をDockerfileに追記すればOK

```
ENV LANG C.UTF-8
```

非常に初歩的なことだが、いつもの環境だとOSのインストール時に`locale`を設定してしまうので、気付かなかった。

Dockerを使っていると、こうした設定ミスが明らかになるので良い。
セレクトボックスで選択されていない要素を動的にdisabledする

あまり使う機会が無いかもしれませんが。
主にPHPを使ってデータ変更をする時を想定しています。
データ変更時に権限がないと変更出来ない部分を作りたいけど、`select`をdisabledにしてしまうと
`select`がPOSTされないので若干面倒くさいことになったりします。

そういうときはselected以外の`option`をdisabledにしてしまえば解決します。

```HTML
<select id="sample" name="sample">
    <option value="0">選択肢1</option>
    <option value="1" selected>選択肢2</option>
    <option value="2">選択肢3</option>
</select>
```

```JavaScript
$(function(){
    // 画面表示時にselected以外をdisableにする
    $("#sample option:not(:selected)").prop('disabled', true);
});
```

↓

```HTML
<select id="sample" name="sample">
    <option value="0" disabled>選択肢1</option>
    <option value="1" selected>選択肢2</option>
    <option value="2" disabled>選択肢3</option>
</select>
```

これでPOSTした時にきちんとsampleの値を送れるし、選択肢を変更することも出来なくなりました。
あとは何らかの条件が成立した時（sessionを見て管理者でログインしていれば、等）に
`$("#sample option:not(:selected)").prop('disabled', false)`としてやれば全て選択できるようになります。

selectedを動的に出すのはよくやりますが、それ以外をdisabledにするとなるとjQueryとかを使ったほうが楽ですね。
JavaからGroovyのConfigSlurper使う

#きっかけ
JavaMailに食わせるpropertiesをたらたら書くのが嫌になった。
propertiesより読み書きが楽でPropertiesにそのまま変換できる形式を探した。

```config.properties
mail.debug=true
mail.store.protocol=pop3

mail.pop3.host=mail.example.co.jp
mail.pop3.port=110
...

```

config.groovyはグルーピングできるので最強に見える

```groovy:config.groovy
mail{
  debug=true
  store.protocol='pop3'

  pop3{
    host='mail.example.co.jp'
    port=110
    ...
  }
}

```
```java:sample.java
ConfigObject config = new ConfigSlurper().parse(new File("config.groovy").toURI().toURL());
Properties prop = config .toProperties();

Session session = Session.getDefaultInstance(prop);
Store store = session.getStore()
store.connect()
Folder folder = store.getFolder("INBOX")
folder.open(Folder.READ_WRITE)

```

あと、コード内で柔軟に扱える

```groovy:config.groovy
HogeConf{
  fuga='fugafuga'
}

JavaMail{
  mail{
    debug=true
    store.protocol='pop3'

    pop3{
      host='mail.example.co.jp'
      port=110
      ...
    }
  }
}

```
```java:sample.java
ConfigObject config = new ConfigSlurper().parse(new File("config.groovy").toURI().toURL());
ConfigObject javaMailConfig = (ConfigObject)config.get("JavaMail");
Properties prop = javaMailConfig.toProperties();

Session session = Session.getDefaultInstance(prop);
Store store = session.getStore()
store.connect()
Folder folder = store.getFolder("INBOX")
folder.open(Folder.READ_WRITE)

```

##この記事見てやってみた

[Java アプリケーションのための設定ファイル形式の比較](http://qiita.com/k_ui/items/7b83e4dd48940b40bddf)
ESXi 6.0 update2でESXiのHost ClientにアクセスするとAngularJSのエラー

ESXi 6.0 build 3959074（6.0 Update2＋2016年8月のパッチ）のHost Client（ブラウザベースのクライアント画面）アクセスすると、ブラウザ上で以下のエラーが発生することがある。

    The error reads
    Unhandled Exception
    Unfortunately, we hit an error that we weren't expecting.
     
    The client may continue working, but at this point, we recommend refreshing your browser and submitting a bug report.

「詳細」ボタンを押すと、以下の情報が出てくる。

    Cause: Error: [$rootScope:inprog] http://errors.angularjs.org/1.3.2/$rootScope/inprog?p0=%24digest
    
    Version: 1.4.0
    Build: 3959074
    ESXi: 6.0.0
    Browser: ...

同様の問題が[VMware Comunitiesに報告](https://communities.vmware.com/message/2618258#2618258)されており、2016/09/20時点で以下のような[VMware社員からの返信](https://communities.vmware.com/message/2621412#2621412)がある。

> この問題は少し前に改修済みで、次の6.0パッチリリースでのアップデートバージョンでリリースされる予定だ。現時点では、最新のFLINGリリースをインストールする手がある: [labs.vmware.com/flings/esxi-embedded-host-client](https://labs.vmware.com/flings/esxi-embedded-host-client)

FLINGリリースの適用で[質問者の環境では解消した](https://communities.vmware.com/message/2622023#2622023)とのこと。

この投稿以後だと、10月に最新パッチが出ているが、[修正内容](https://kb.vmware.com/kb/2147330)を確認したところこの問題には触れられていない様子だった。この修正が取り込まれているかはっきりせず、もしかしたらUpdate3等で乗りリースの可能性もある。
さくらインターネットが主催(一部共催含む)するイベントに関するイベント登録管理サービスのページのまとめ

# Doorkeeper
- [さくらのイベント（北海道版）]
(https://sakura-hokkaido.doorkeeper.jp/)
- [さくらのイベント（東北版）](https://sakura-tohoku.doorkeeper.jp/)
- [さくらのイベント（関東版）](https://sakura-kanto.doorkeeper.jp/)
- [さくらのイベント（東海版）](https://sakura-tokai.doorkeeper.jp/)
- [さくらのイベント（関西版）](https://sakura.doorkeeper.jp/)
- [さくらのイベント（中四国版）](https://sakura-chushikoku.doorkeeper.jp/)
- [さくらのイベント（九州版）](https://sakura-kyushu.doorkeeper.jp/) …九州と、沖縄

# connpass
- [さくらインターネット株式会社さんのプロフィール（主催イベント一覧）]
(https://connpass.com/user/sakurapr/open/)

# ATND
- [sakura_pr's Profile](https://atnd.org/users/48718?state=manage)
Cognosの特定のバージョンで使用可能なモジュール一覧を知る方法

Cognosを購入されているお客様先に、どういうメディアのセットが納品されているか、あるいはどういうモジュールがダウンロードできるか、お客様に確認して頂かないとわからない時がありますよね。

そういう時には、こちらのサイトを確認しましょう。

ポイントは「downloading」という文言を付けて、google等で検索すれば、各Cognosのバージョンで何が納品されるか一覧が出てきます。

例えば、「downloading cognos 10.2.2」で検索という要領です。
Cognos TM1やExpressも検索可能です。

【Downloading IBM Cognos Business Intelligence 10.2.1】
http://www-01.ibm.com/support/docview.wss?uid=swg24034211

【Downloading IBM Cognos Business Intelligence 10.2.2】
http://www-01.ibm.com/support/docview.wss?uid=swg24037529

【Downloading IBM Cognos Analytics】
http://www-01.ibm.com/support/docview.wss?uid=swg24042763
Ruby や Bundler の個人的メモ

このページは Bundler の可愛さ（？）をお楽しみ頂くため邪魔にならない程度の差し障りのない~~会話をお楽しみいただく~~メモを晒すページです。

つまり俺得なだけで他に寄与しません！
Qiita に記事を書いている皆様には 99% 耳タコな話でしょう！

真面目な話をすると、主に日本語情報が少ないと感じたものや、これって補足したいなーって情報を忘れないためにメモするページ。

# エラーメッセージメモ

## Don't run Bundler as root...

```shell-session
$ sudo bundle install

Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root will break this application for all non-root users on this machine.
```

### エラーの内容補足
言いたいことは何となくわかるが、逆に何となくしかわからなかったのでぐぐってみた。

[Print warning when bundler is run by root · Issue #2936 · bundler/bundler](https://github.com/bundler/bundler/issues/2936)
[ruby - "Don't run bundler as root" - what is the exact difference made by using root? - Stack Overflow](http://stackoverflow.com/questions/25437817/dont-run-bundler-as-root-what-is-the-exact-difference-made-by-using-root)

> Running sudo bundle install can cause huge and cascading problems for users trying to install gems on OS X into the system gems. We should print a warning and explain that Bundler will prompt for sudo if it's needed. We should also warn people that sudo bundle will break git gems, because they have to be writable by the user that Bundler runs as.

要するに「root で install するとシステムの gem ぶっ壊すかもしれないから注意メッセージ出そう」ってことらしい。
コメントでは OS X について言及しているようだが、別に Linux でも起きない話ではない。


### 対応方法

「じゃぁ root やめるわ」ってのが正しいんだろうけど、Rails などのリモートアクセスを許すサービスの実行権限をちゃんと分けているかが気になった。

例えばベタで書くとこんな感じのアプリケーションの実行環境があったとする。

```shell-session
# root がだめなので専用のユーザー権限作って対応するよ！
$ sudo -u rails git pull original-rails-app && cd original-rails-app
$ sudo -u rails bundle install

# supervisord で実行するも root じゃなくて rails ユーザーに設定済みだ！
$ sudo supervisorctl start original-rails-app
```

これだと万が一アプリケーションに任意のファイル書き込みを許すバグがあった場合に、~~バグの前提が酷すぎるという話は置いといて~~簡単に悪意のあるコードが埋め込まれてしまう。

要は supervisord で実行する際に nobody 等の別の権限のユーザーを使っていればいいのだけれど、まだまだ現役である CentOS-6系 EPEL にある `supervisor.noarch-2.1-9.el6` では実行ユーザー権限の変更ができない。

結局のところ下記のどれかの対応が必要になる。

* supervisord-3 を入れて nobody など安全なユーザー権限で実行する。
* 諸事情で supervisord-3 を入れられない場合は supervisord を諦めて直接 unicorn を nobody などの安全なユーザー権限で実行する。
* 諸事情で（略）supervisord じゃなくて upstart 使う。
* SELinux 等の強制アクセス制御可能な仕組みを導入して書き換えを防ぐ。
UE開発困ったメモと解決方法

後ほど加筆修正予定

## Media Player で動画再生させていたが、パッケージすると再生されなくなる
ファイル形式はWAVでした

4.12で既知のバグらしい。

Media player **not always** working after packaging - UE4 AnswerHub
https://answers.unrealengine.com/questions/439444/media-player-not-always-working-after-packaging.html

4.13にてFIXされてた。手元で試して再生された。

UE-32353 （Media Player Asset not Playing in Packaged Game）
https://issues.unrealengine.com/issue/UE-32353

**-> アップデートして解決**

Media Player周りの仕様がガラッと変わっており、4.12向けで作ったプロジェクトでは動画が再生されなくなるので注意が必要。

4.12以前では Media Playerアセットにファイルパスを直接指定していたが、それがなくなった。
> https://docs.unrealengine.com/latest/INT/Engine/MediaFramework/HowTo/StreamMediaSource/index.html

## フルスクリーンモードをコマンドで切り替えたい

**-> Execute Console Command で実行**

http://konabe.blog.jp/archives/23994470.html

## ゲーム起動後、自動的にセカンドディスプレイでフルスクリーンにしたい

ディスプレイ指定で立ち上げはできなさそうなので、
ウィンドウ位置をセカンドディスプレイまでもっていき、フルスクリーンコマンド叩くようにする。

BluePrintから呼べる関数にはウィンドウ位置を動かせるものがないので、
C++用いてBPから呼べるウィンドウ移動関数を作って、移動してから、フルスクリーンにする。

参考）https://answers.unrealengine.com/questions/327914/swindowmovewindowto-fvector2d-newposition-doesnt-w.html

```
GEngine->GameViewport->GetWindow()->MoveWindowTo(ScreenPosition);
```
[メモ] cantools の サンプルコード dbclsを VCでビルド

## 概要
- 作業メモ
- [cantools](https://sourceforge.net/projects/cantools/)のサンプル `dbcls`をVisual C++ 2015でビルド
- `cantools-0.19`
- `dbcls`は、`cantools`内の`libcandbc`のみ使用。
- getoptは、こちらを利用: [getopt / getopt_long for Windows Visual C/C++ (MIT LICENSE)](https://github.com/takamin/win-c)
- `basename()`は、`_splitpath`を使用


## 環境
- Windows 7 64ビット
- Visual Studio 2015 Update 3

## 手順
1. `git clone https://github.com/mt08xx/cantools_canls_vc.git`
2. `cantools_canls_vc.sln`をダブルクリックして、VCを開く
3. (構成をえらんで) CTRL+SHIFT+B で、ビルド

##　その他
- 関連: [[メモ] オープンソースのcantools の libcandbcで、.dbcファイルの読み込み](http://qiita.com/mt08/items/fbe61c7caf2c4e5b3b17)
- `basename()`は、こんな感じ

    ```c
...
#if 0
#include <libgen.h>
#else
#include <stdlib.h>
char path_buffer[_MAX_PATH];
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];

    char *dirname(char *path) {
        _splitpath(path, drive, dir, fname, ext);
        return dir;
}
char *basename(char *path) { 
        _splitpath(path, drive, dir, fname, ext);
        return fname;
}
#endif
...
```
- `dbcls`なのに、`canls`で作業してたな...