SSH メモ

■秘密鍵から公開鍵を復元する:
$ ssh-keygen -y -f 秘密鍵のパス > 復元した公開鍵のパス

■github で使われるFingerprintの取得:
$ ssh-keygen -l -E md5 -f 鍵のパス

参考にしたサイト:
ssh-keygenで秘密鍵から公開鍵を生成する
https://gist.github.com/yosemitebandit/1994947

広告

github のリポジトリをSourceTree で扱うために大事なこと

[ツール]>[オプション]で次のように設定します:
SourceTreeSetting

HaskellからFFIでCの配列を扱う(マーシャリング)

HaskellのFFIについてはこのブログでも例えばこんな記事で扱っている.

今回はその記事では触れなかったマーシャリングについて扱う.まずは次のようなCの関数があったとしよう:

#include <stdlib.h>
#include <stdio.h>
#include "c_header.h"

/*
int sum(int* p);

int fib(int** pp, int n);
*/

int sum(int* p, size_t n)
{
  if(n == 0){ return 0; }
  size_t i;
  int retval = 0;
  for(i = 0; i < n; ++i)
  {
    retval += p[i];
  }
  return retval;
}

int fib(int** pp, int n)
{
  if(n<=0){ return 1;}
  *pp = malloc(n * sizeof(int));
  if(n>=1){ (*pp)[0] = 1;}
  if(n>=2){ (*pp)[1] = 1;}
  if(n>=3){
    int i;
    for(i=2; i < n; ++i)
    {
      (*pp)[i] = (*pp)[i-1] + (*pp)[i-2];
    }
  }
  return 0;
}

これらのコードは次のように使われる:

#include <stdio.h>
#include <stdlib.h>
#include "src/c_header.h"

#define N 10
int main(void)
{
  int array[] = {1,2,3,4,5,6,7,8,9,10};

  int s = sum(array, sizeof(array)/sizeof(array[0]));
  printf("sum=%d\n",s);

  int* p = 0;
  int r = fib(&p,N);
  if(r==1){ printf("failed"); }
  else{
    int i;
    for(i=0; i < N; ++i)
    {
      printf("fib(%d)=%d\n",i,p[i]);
    }
  }
  free(p);
  return 0;
}

sumやfibは次のようにHaskellから扱える:

module Lib
    where

import Foreign.C.Types
import Foreign.Ptr
import Foreign.Marshal.Array
import Foreign

-- int sum(int* p, size_t n);
foreign import ccall "c_header.h sum" cSum
  :: Ptr CInt -> CSize -> IO CInt

hSum :: [Int] -> IO Int
hSum xs =
  let
    xs' = fromIntegral <$> xs :: [CInt]
    len   = fromIntegral $ length xs :: CSize
  in
  do
    arr <- newArray xs' :: IO (Ptr CInt)
    l <- return len  :: IO CSize
    ret <- cSum arr l :: IO CInt
    return $ fromIntegral ret

-- int fib(int** pp, int n);
foreign import ccall "c_header.h fib" c_fib
  :: Ptr (Ptr CInt) -> CInt -> IO CInt

hFib :: Int -> IO [Int]
hFib n =
    do
      ptrOut <- malloc  :: IO (Ptr (Ptr CInt))
      n' <- return $ fromIntegral n :: IO CInt
      ret <- c_fib  ptrOut  n' :: IO CInt
      out <- peekArray n =<< peek ptrOut :: IO [CInt]
      free =<< peek ptrOut
      free ptrOut
      return (fromIntegral <$> out) :: IO [Int]

cSum と hSum, c_fibとhFibのシグネチャは結構ずれている.
関数cSumは sum と同様にポインタとサイズを受け取る.hSum ではサイズを配列から計算しているので長さを引数にする必要がない.
また,c_fib では二重ポインタと長さを引数にしているが,hFibでは長さだけが引数となっている.c_fib の引数となっている二重ポインタは出力用の変数だからである.

次のコードはhSum,hFibの使用例である.

module Main where

import Lib

main :: IO ()
main =
  do
    a <- hSum [1,2,3,4]
    print a
    xs <- hFib 15
    print xs

stack でこのコードをビルドする場合,stack.yaml に次のような行を加えねばならない:

c-sources:  src/c_impl.c

github メモ

自分用メモです.

■開発作業
git checkout -b hoge #作業用ブランチを作成
★自由にコード等を編集する.
git commit -m "fix bug" #変更内容をコミット
git push origin hoge #自分のレポジトリにプッシュ
★github ページに言ってPull Request を作る.
★権威ある人に merge してもらう.

■自分のレポジトリを最新の状態に更新する
(git remote add upstream git@github.com:foo/bar.git)← upstream の登録は一度やればいい
git checkout master #作業ブランチを master に
git pull upstream master
git push origin master #自分のレポジトリにpush

■開発ブランチにmasterの内容を適用する(rebase)
git checkout master
git pull origin master
git checkout hoge
git rebase master

■コンフリクトが起きたとき:
git mergetool somewhere/conflictedSource.hs
これでWinMergeが勝手に立ち上がってくれる.(WinMergeをインストール済みであり,Gitに対応付けてある場合).

★叱られたらファイルを修正して
git rebase –continue

■何がうまくいかない場合とりあえず現状を把握する
git status

■Updates were rejected because the tip of your current branch
is behind とか言われた場合
git pull origin yourLocalBranchName

■ローカルでの変更が邪魔して pull できない場合
git stash save "some-name"

■作業ブランチの確認
git branch

■ブランチ一覧
git branch -a

■リモートブランチの一覧
git branch --remote

■リモートブランチ foo の削除
git push origin :foo

■リモートブランチ foo にある hoge ファイルだけ取ってくる
git fetch
git checkout origin/foo -- path-to-file

■作業ブランチをhogeに変更
git checkout hoge

■作業ブランチの名称を fuga に変更
git branch -m fuga

■手元のブランチ piyo をリモートに登録する
git push -u origin piyo

■git管理下にあるファイル一覧
git ls-files

■git管理下にあるファイルをすべてadd
git add .

■git管理下にあるファイルのリネーム
git mv aaa.txt bbb.txt

■出したプルリクを取り下げる
remoteにpush済みのブランチを削除することで紐づくpull requestを削除出来ます
git push --delete origin hoge

■url の確認
git remote -v

■git管理下にあるファイルを削除
git rm hogehoge
(ディレクトリごと:git rm -r hogedir )

■ファイルをローカルに残したままgit管理下からファイルを除く
(1) git rm --cached hogehoge
(2) .gitignore に追記する

■originの変更
git remote set-url origin git@github.com:foo/bar.git

■upstreamの変更
git remote set-url upstream git@github.com:foo/bar.git

■自分がコミットしたところだけログを見る
git log --author=differential.engine@gmail.com

こうやって
commit 23985b88d43328a72bacafb784d7e30f78357f83
Author: dif_engine
Date: Fri Jul 6 23:00:00 2018 +0900

だったとき
git diff 23985b88d43328a72bacafb784d7e30f78357f83 > hoge.txt
とするとコミット 23985b88d43328a72bacafb784d7e30f78357f83 から HEAD までの差分が手に入る.一般には
git diff COMMIT-ID1:COMMIT-ID2 > out.txt