読者です 読者をやめる 読者になる 読者になる

spring of life

技術、ときどき日常のブログ(予定)

samba で windows のフォルダをマウント

samba

明けましておめでとうございますm(_ _)m

今年もぼちぼち書いていきますかね〜

更新頻度はどうなるか分からないけど、継続したいね


で、今年1発目は samba のことをちょっとだけ。というか忘れそうなのでメモ程度のことを。

まずやりたいことは、Windows Server 2012 R2 に作った共有フォルダを Linux(CentOS) でマウント で、Windows Server と Linux の環境構築 & 設定は↓に

Window Server 2012 R2 の設定
  1. 共有フォルダを作成
    • フォルダは任意の名前・場所で作成してOK
  2. 共有フォルダのアクセス制御の設定
    1. エクスプローラーから作成したフォルダの場所まで移動してプロパティを表示
    2. 共有タブを開く
    3. ネットワークのファイルとフォルダーの共有のところに「設定されていません」と表示されていると思うので「共有」ボタンを押す
    4. 共有する相手を選択して「共有」ボタンを押すとネットワークワークパスが表示される
      • 必要であれば事前にユーザーを作っておく
      • ユーザーは「スタート」→「管理ツール」→「コンピューターの管理」→「ローカルユーザーとグループ」→「ユーザー」で右クリック→「新しいユーザー」から作成
    5. 「詳細な共有」ボタンを押して共有名などを設定(既に入力されているかも)
    6. (2016/01/06 追記)書き込み権限を追加する
      • 「詳細な共有」のところで、「アクセス許可」ボタンを押して共有で使うユーザーを追加する
      • 必要に応じて「フルコントロール」、「変更」、「読み取り」にチェックを入れる(読み取りだけだとファイルに書き込んだり、ファイルを削除できない)
Linux の設定
  1. samba-client, cifs-utils パッケージをインストール(yum -y install samba-client cifs-utils
  2. コマンド、または/etc/fstabに設定を書いてマウント
    • Windows Server の方で設定した「共有する相手」のユーザー名とパスワードを指定する
    • ユーザー名とパスワードは別ファイルに書いておいても良い

コマンドの場合

  • ユーザー名、パスワードを直接指定
# mount.cifs -o username=<ユーザー名>,password=<パスワード> //<Windows Server の IP アドレス>/<共有名> <マウントされるディレクトリ>
  • ユーザー名、パスワードをファイルに記載
/etc/smb.cred (ファイルのパスは任意)
username=<ユーザー名>
password=<パスワード>
----
# mount.cifs -o credentials=/etc/smb.cred //<Windows Server の IP アドレス>/<共有名> <マウントされるディレクトリ>

/etc/fstabに記載する場合

//<Windows Server の IP アドレス>/<共有名> <マウントされるディレクトリ> cifs <オプション> 0 2
  • <オプション>はコマンドの方で o オプションの後に付けた文字列

Base64エンコード

Java Android

最近平日も開発作業とかしたりしてて、書くことが溜まってきてて大変 笑

ちょっと寝るの遅くしたんだよね〜

昔から寝てる時間てなんかもったいないな〜とか思うタイプの人間で、できるだけ寝たくないんだが、仕事し始めてからは寝坊が恐いので寝る時間を早くしてた。

けど、やっぱ寝すぎだな!ってなって遅くした

でも寝ないのはダメだとは思うな〜寝た後の頭の整理されてる感はすごいからね



本題入りますか〜今日は久しぶりにJava

家計簿のアプリで、アプリ認証入れた時の対応

Android とかのアプリで WebAPI 使って収支情報をサーバー側に登録する時に、Authorization ヘッダーで認証するようにしたんだが、その時にIDとキーをエンコードしたので、その方法をメモ

Java 1.8

1.8 だと標準で入ってるので、以下のように(1.8 未満の場合は。。。)

import java.util.Base64;
...
String credential = Base64.getEncoder().encodeToString((application_id + ":" + application_key).getBytes());
Android

AndroidJava だけどっていうのはおいといてー

ちょっと使い方違うけど、ちゃんと用意されてるっぽい

import android.util.Base64;
...
byte[] credential = Base64.encode((application_id + ":" + application_key).getBytes(), Base64.DEFAULT);
String credential = new String(credential, "UTF-8");

bootbox でエラーを通知する

javascript

家計簿のアプリで bootstrap は前から使っててお世話になってるんだけど、入力エラーを通知しようとした時の alert を bootstrap で作ろうとしたら意外とめんどかった(´・_・`)

まぁ http://getbootstrap.com/components/#alerts とかあるんだけど、ポップアップで通知したかったんだよね〜

で、いろいろ調べてたら bootbox ってのがあったので使ってみた

Bootbox.js — alert, confirm and flexible dialogs for the Bootstrap framework

ちゃんと Rails アプリ用に bootbox-rails っていう gem があるのでこれをインストール

# Gemfile
...
gem 'bootbox-rails'
...

そして、application.js に設定

# app/assets/javascripts/application.js
...
//= require bootbox
...

これで使えるようになる

で、自分の場合は、フォームの内容を登録するリクエストを ajax で送って、内容が不正だったらポップアップで通知する、っていうのを作った

$ ->
  $('#hoge')
    .on 'ajax:error', (event, xhr, status, error) ->
      bootbox.alert({
        message: '<div class="text-center alert alert-danger">fuga</div>',
      })

まぁだいたいこんな感じで message に html を入れてその中に bootstrap で用意されているクラスを指定すればポップアップに反映される



あと、ついでにtype="reset"のボタンを作れば入力フォームを全て空欄にできる

<input type="reset".../>

それと、required="required"を入れればその入力項目は必須になる(html5

<input required="required".../>

Rails の場合は

<%= f.text_field :hoge, {:required => true} %>

みたいな感じ

kaminari のテンプレートでローカル変数を使う

Rails

今日はもう1つ書くよ!

kaminari を使って、テンプレートの中で

<%= paginate @objects %>

みたいにページングする時、第2引数にハッシュを指定して値を_paginator.html.erbに渡せるっぽい

例えば、

# hoge.html.erb
...
<%= paginate @objects, {:hoge => 'fuga'} %>
...

で、

# _paginator.html.erb
<%= paginator.render do -%>
  ...
  <%= hoge %>
  ...
<% end %>

みたいな感じで使える。

あと、ついでにだけど、上の話でいうところの@objectsの中にはいろいろ情報が入ってるらしい。詳しくは↓で

qiita.com

ブロックの上下中央寄せ

CSS

少し前から bootstrap を使ってるけど、ブロックの上下中央寄せって用意されてない気がしていろいろ調べてみた。
やっぱり自分で作らないといけないっぽい?みたいで↓のような感じでできた

<div class="row row-center">
  <div> ... </div>
  <div> ... </div>
</div>
.row-center {
    display: flex;
    align-items: center;
}
  • flexrowは bootstrap に用意されてるもの

参考:
stackoverflow.com

plantuml のいろいろ調査メモ

plantuml sphinx Emacs

sphinx + plantuml で UML 作ったりしてて、いろいろ使い方とかを調べたのでちょっとまとめとこう

UML を別ファイルに記述

  • .. uml::の下に UML を書いてると1ファイルが長くなっちゃう時がある
  • .. uml:: umls/hoge.umlとファイル名を指定すると、 hoge.uml に plantuml で書いた UML を挿入できる
  • ファイルのパスは相対パスでOK

plantuml-mode

  • ファイルを分けたのは便利だけど、UMLemacs で編集しようとするとインデントやハイライトとかの設定がなくて書きづらい。。。
  • plantuml-mode っていうパッケージを入れるとそこらへんを上手くやってくれる

インストール手順

※ 事前にパッケージをインストールできるようにしてあること

  • emacs のバージョンアップ(M-x package-install が使えるくらいまで)
  • もしかしたらadd-to-listでパッケージを追加しないといけないかもしれない
  • (大丈夫だと思うけど)plantuml.jar をダウンロードして使えるようにしておくこと
  1. emacs 上でM-x package-install [ret] plantuml-mode [ret]を実行してインストール
  2. ↑を実行しただけだと plantuml.jar がないと言われて使えない場合があるのでパスを設定
    • デフォルトだと~/plantuml.jarとなっている(plantuml-mode.el を開いて plantuml.jar で検索したら見つかるはず)
  3. ↓を追記すると .uml ファイルが自動で plantuml-mode になる
    • 拡張子が違う場合は適宜\\.uml$の部分を変える
(add-to-list 'auto-mode-alist '("\\.uml$" . plantuml-mode))
(require 'plantuml-mode)

conf.py での plantuml.jar の場所の指定

  • ここは絶対パスで書いたほうがいいみたい
  • でも sphinx をビルドするサーバーを変えるとパスが変わるかもしれないので、あまり書きたくない
  • そういう時はosモジュール(?)を使うと便利
import os
...
# os.path.abspath で絶対パスを取得
plantuml = ['java', '-jar', os.path.abspath('lib/plantuml.jar')]

Selenium-WebDriver のインストール

RSpec Rails

前にこんな Capybara-Webkit のインストール方法の記事を書いたんだけど
leonis.hatenablog.com
Selenium-WebDriver も使ってみることにした。

最近は 3.x にアップデートされてるみたいだけど、CentOS 6 だと無理っぽかった。
Firefox を使ったんだけど、Selenium::WebDriver.for :firefoxの所でエラーが出る
WebDriver と Firefox のバージョンが合わないのかなぁといろいろ試したけどどれもダメだった

で、 3.x は諦めて↓の組み合わせだとうまくいった

Capybara-Webkit とだいたい環境構築は同じだけど、一応メモ

環境構築

1. Xvfb のインストール

  • 仮想ディスプレイで実行する場合は必要なのでインストール
  • インストール方法
  # yum groupupdate "X Window System"
  # yum install xorg-x11-server-Xvfb

2. Headless のインストール

  • これは Gemfile とかに書いてbundle install

3. Selenium-WebDriver のインストール

  • これも Gemfile とかに書いてbundle install

4. machine-id の生成

  • これが Capybara-Webkit のインストールの時にやらなかったことで、machine-id がないと怒られる
  • コマンドを実行すればOK
# dbus-uuidgen > /var/lib/dbus/machine-id
使い方
  • Headless を起動
Headless.new.start
driver = Selenium::WebDriver.for :firefox
  • あとはこのdriverを使っていろいろ操作すればOK
  • 操作方法とかはここにいろいろ書いてあるからそれを見ながら実装かな