昨晩は、n桁の16進数を生成しました。

今晩は、n文字のランダムな半角英数文字列を生成するRubyスクリプトを書いてみました。

ただ文字列を生成するだけだとあまり面白くないので、optparseを使ってオプションを取るようにしました。

以下、コード。

   1  #/usr/bin/env ruby
   2   
   3  require 'optparse'
   4   
   5  def main(argv)
   6    options = {}
   7   
   8    option_parser = OptionParser.new {|opt|
   9      opt.on('-l LENGTH', '--len LENGTH', 'Set password length'){|v| options[:l] = v}
  10      opt.on('-a [OPTIONAL_CHARS]', '--add [OPTIONAL_CHARS]', 'Add optional characters'){|v| options[:a] = v}
  11      opt.parse!(argv)
  12    }
  13   
  14    if options[:l]
  15      puts mkpasswd(options[:l].to_i, (options[:a] || "").split(//))
  16    else
  17      puts option_parser
  18    end
  19  end
  20   
  21  def mkpasswd(n, optional_chars)
  22    passwd = ""
  23   
  24    lower_chars = ("a".."z").to_a
  25    upper_chars = ("A".."Z").to_a
  26    numbers = ("0".."9").to_a
  27   
  28    passwd_chars = (lower_chars + upper_chars + numbers + optional_chars).uniq
  29    passwd_chars_size = passwd_chars.size
  30   
  31    passwd = Array.new(n){ passwd_chars[rand(passwd_chars_size)] }.join
  32   
  33    return passwd
  34  end
  35   
  36  main(ARGV)

使い方は、

   1  $ ruby mkpasswd.rb           
   2  Usage: mkpasswd [options]
   3      -l, --len LENGTH                 Set password length
   4      -a, --add [OPTIONAL_CHARS]       Add optional characters
で確認できます。

実際に使ってみます。

63文字の文字列を生成する

   1  $ ruby mkpasswd.rb -l 63     
   2  qyXsKDICRoyweiA3MPVkC1Q2xXdY5uh00cxgWGrhj1b7HKvMwUNkpmSOG1QJTuk

-aオプションを使って, 記号を入れる

   1  $ ruby mkpasswd.rb -l 63 -a _@!
   2  My!n1WEYoc1R94JJW3X6JtmPKCJOjseWuubhH8R_bRo6bYnwAoKgSNzfyskv@RD

とまぁ、こんな感じです。

細かいところは気にせず自分用に書いたので、まだまだ改良する必要があります。

なんとなく、GitHub に置いてみました。

もしよければ使ってみてくださいm(_ _)m

posted by Png y_tsuda on Tue 4 Nov 2008 at 22:20

WPA-PSKのために64桁の16進数を作成したくて、ちゃちゃっと書いてみた。

   1  def mkhex(n)
   2    hex_str = ""
   3  
   4    n.times do 
   5      hex_str << "%x" % rand(16)
   6    end
   7  
   8    return hex_str
   9  end

実行してみるとこんな感じ。

   1  mkhex(64)
   2   #=> "98979206f86479fe2c17a987b23ba787c41afd405d7f7efbe2d61484f065d413"

WPA-PSKは、64桁の16進数の他に、8~63文字の半角英数字(ASCII)も受け付けているので、今度はそっちを生成するコードを書いてみようかな。

posted by Png y_tsuda on Tue 4 Nov 2008 at 01:40

たいしたものではないですが、 iPhoneアプリ開発用に Linked ListとLRUCacheを実装したユーティリティライブラリを公開します。

http://github.com/genki/s21gutils/tree/master

本当はサードパーティフレームワークの形にしたかったんですが、 iPhoneでサポートされてないようなので、ソースとUnitTest用プロジェクトの形で公開します。

ヘッダファイルをコピーとかするのが面倒なので、 Gitでソースを管理してるプロジェクトで使う場合は、 以下のようにGit submoduleとして追加するとメンテナンスが楽かもです。

   1  % git submodule add http://github.com/genki/s21gutils/tree/master Classes/s21gutils

Public Domainです。無償・商用問わず自由に使ってください。 よろしくお願いします。

posted by Png genki on Sun 2 Nov 2008 at 07:55

ちょっとした時間計測に使っているマクロです。

   1  #define BM_START(name) NSDate *name##_start = [NSDate new]
   2  #define BM_END(name)   NSDate *name##_end = [NSDate new];\
   3    NSLog(@"%s interval: %f", #name, [name##_end timeIntervalSinceDate:name##_start]);\
   4    [name##_start release];[name##_end release]

iPhoneアプリを開発している場合、シミュレータ上の動作時間と 実機での動作時間は全く異なるので、 実際に実機で動かしてみた場合にどの程度の時間がかかっているかを 測定するのに使っています。

   1  BM_START(something);
   2  /* do work */
   3  BM_END(something);

こんな感じに使います。

posted by Png genki on Sat 1 Nov 2008 at 15:17

s21gブログをお使いの皆様へ。

s21gブログでは、サービスの改善に供するために Google Analyticsを使用していますが、 以下に該当するブロガーの皆様に、このブログのレポートページへの アクセス権を解放する事にいたしました。

  • 一ヶ月に一回程度以上記事を投稿している方(これから始めるという方でもOkです)
  • Googleアカウントのメールアドレスをご連絡いただける方

ご希望の方は、 @takiuchiか、 info{at}s21g{dot}com までご連絡ください。

よろしくお願いいたします。

posted by Png genki on Sat 1 Nov 2008 at 14:19

しばらく使ってなくて忘れそうになったのでメモ。

   1  int n = CGColorGetNumberOfComponents(color);
   2  float (*comps)[n] = (float(*)[n])CGColorGetComponents(color);

C99は良いなあ。

posted by Png genki on Fri 31 Oct 2008 at 15:45

半透明ステータスバーの透明度は多分 0.6

キーボードのアニメーション速度は0.3秒

UITextViewのマージンは8ピクセル。 現在のところ、UITextViewのマージンを(普通に)設定する方法は無いらしい。

posted by Png genki on Fri 31 Oct 2008 at 14:27

間違ってremoteブランチを作ってしまったのですが、勉強になったので記事にしておきます ;P

remoteにlocal_deployブランチを作成

   1  $ git push origin local_deploy  #間違って作成
   2  $ git branch -a
   3  * master
   4    origin/HEAD
   5    origin/deploy
   6    origin/local_deploy #ローカルにも反映されている
   7    origin/master

remoteブランチを削除

   1  $ git push origin :local_deploy
これでサーバ側は反映されました。

別のローカルリポジトリ(cloned)で削除が反映されない

しかしもう一つ別のディレクトリで同じgitリポジトリをcloneしていて、そちらで削除が反映されない状況に。

下記の1.の説明にあるように、(remoteブランチの追加は自動でされるが)削除されたものはローカルで明示的に削除しないといけないようです。

Delete unneeded branch
$ git clone git://git.kernel.org/.../git.git my.git
$ cd my.git
$ git branch -d -r origin/todo origin/html origin/man (1)
$ git branch -D test (2)

  1. Delete remote-tracking branches "todo", "html", "man". Next fetch or pull will create them again unless you configure them not to. See git-fetch(1).  
  2. Delete "test" branch even if the "master" branch (or whichever branch is currently checked out) does not have all commits from test branch.

http://www.kernel.org/pub/software/scm/git/docs/git-branch.html

(上によると、git branch -d -r origin/removed_branchでもremoteブランチが削除できるようですね)

コマンドgit remote show origin, git remote prune origin

git remote辺りにコマンドがあると知ったので見てみると、git remote showがありました。 確認すると、腐りかけた(Stale)tracking branchと表示されています。

   1  $ git remote show origin
   2  * remote origin
   3    URL: ssh://git.s21g.com/mnt/git/blog.git
   4    Remote branch merged with 'git pull' while on branch master
   5      master
   6    Stale tracking branch (use 'git remote prune')
   7      local_deploy
   8    Tracked remote branches
   9      deploy master

そして、pruneで削除。ヘルプには、--dry-runでやるとどのブランチをpruneするかレポートしてくれて、実際のactionはしない旨が記述されているのですが、私の環境では削除されてしまいました。

   1  $ git remote prune origin --dry-run

Refs

http://www.kernel.org/pub/software/scm/git/docs/git-remote.html
http://www.kernel.org/pub/software/scm/git/docs/git-branch.html
http://reinh.com/blog/2008/04/18/git-push-just-the-tip.html

posted by Png satoko on Fri 31 Oct 2008 at 12:51

Gitに関するリンク集
http://blog.s21g.com/articles/548

gitをやり始めて時間が経ちますが、まだまだ知らないことばかり。
もう一度リンク集作ってみました。

複数で開発するとき

git-pushのコツ:remoteブランチとか
http://reinh.com/blog/2008/04/18/git-push-just-the-tip.html

ブランチを使った開発の流れ
http://b.lesseverything.com/2008/3/25/got-git-howto-git-and-github

gitリポジトリからのdeploy

CapistranoでGitを使う方法のメモ
http://blog.s21g.com/articles/807

rakeタスクからdeployする手順/ワークフロー
http://www.brynary.com/2008/8/3/our-git-deployment-workflow

初心者にも役立つもの

Git It, Got It? Good!:pdf。これシンプルで分かりやすいと思います
http://assets.reinh.com/talks/GIT.pdf
http://reinh.com/blog/2008/02/19/git-it-got-it-good.html

Git用語Glossary
http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#glossary

毎日使うgitコマンド:gitコマンドサンプルが多いのが良
http://www.kernel.org/pub/software/scm/git/docs/everyday.html

posted by Png satoko on Thu 30 Oct 2008 at 17:05

via http://ozmm.org/posts/git_post_commit_for_profit.html

gitのrefspecがよくわからなくて、調べていたら出会った記事です。

.git/hooks/pre-commitをshellスクリプトで

   1  $ chmod 744 .git/hooks/pre-commit
   2  $ cat .git/hooks/pre-commit 
   3  #!/bin/sh
   4  rake test

こういうのもありました。
http://reinh.com/blog/2008/02/21/git-pre-commit-hook.html

   1  #!/bin/sh
   2  rake spec 2> /dev/null

.git/hooks/pre-commitをrubyで

   1  $ cat .git/hooks/pre-commit
   2  #!/usr/bin/env ruby
   3  if `whoami`.strip != 'deploy'
   4    puts "You need to be `deploy`!" 
   5    exit 1
   6  else
   7    exit 0
   8  end

その他のhooks

.git/hooksには下記のようなファイルがあるので、preもpostもできるようです。

   1  post-commit                        
   2  post-receive
   3  post-update                        
   4  pre-applypatch
   5  pre-commit                         
   6  pre-rebase

pre-push hookはないのか

と思ったら、こういうパッチを書いている方がいます。パッチほとんどやったことないので、今度やってみよう。

http://kerneltrap.org/mailarchive/git/2008/8/19/2996404

posted by Png satoko on Thu 30 Oct 2008 at 16:34