pthread_join

2018/04/09

pthread_joinは、別のスレッドが終了するまで待つライブラリ関数・・・。

Man page of PTHREAD_JOIN

第2引数に変数のアドレスを渡すと、start_routineの終了コードをその変数に格納する・・・。
終了まで待つと同時に、終了コードも取得できるという形・・・。

start_routineの戻り値は、渡されたthread_arg->noのアドレスを(void *)にキャストしたもの・・・。
(戻り値が(void *)になっているため、これにキャストしないといけない・・・。)

(void *)型のこういうものを用意して、

pthread_joinの第2引数に渡すと、終了コードを指すアドレスが入るので、(int *)にキャストして参照すると、終了コードが取得できる・・・。

$ ./pthread_join
i = 1, no = 3, message = No.3
i = 1, no = 4, message = No.4
i = 1, no = 2, message = No.2
i = 1, no = 1, message = No.1
i = 1, no = 0, message = No.0
i = 2, no = 4, message = No.4
i = 2, no = 3, message = No.3
i = 2, no = 2, message = No.2
i = 2, no = 1, message = No.1
i = 2, no = 0, message = No.0
i = 3, no = 4, message = No.4
i = 3, no = 3, message = No.3
i = 3, no = 2, message = No.2
i = 3, no = 1, message = No.1
i = 3, no = 0, message = No.0
i = 4, no = 3, message = No.3
i = 4, no = 4, message = No.4
i = 4, no = 2, message = No.2
i = 4, no = 1, message = No.1
i = 4, no = 0, message = No.0
i = 5, no = 4, message = No.4
i = 5, no = 3, message = No.3
i = 5, no = 2, message = No.2
i = 5, no = 1, message = No.1
i = 5, no = 0, message = No.0
return_code[0] = 0
return_code[1] = 1
return_code[2] = 2
return_code[3] = 3
return_code[4] = 4
$

スレッド番号(i == thread_arg[i].no)の値と終了コードの値が等しいので、ちゃんとスレッドの終了コードが取れてるのがわかる・・・。

Sample/pthread_join.c at master · bg1bgst333/Sample · GitHub

【6月14日】 K22  白い風  白い魔法使い  音9

こんにちは!マヤ暦ライフクリエイター ☆山下千草です。
いつも当blogをお読みいただき有難うございます。

f:id:mayamuluc249:20170325211344j:plain

太陽の紋章は「白い風」の日

今日は顕在意識に「白い風」のエネルギーが流れます。キーワード「繊細な感性」「感受性」「スピリット」

素直な思いを伝えましょう。大切な人に大切な思いを伝えてみましょう。

語り合う、共感、インスピレーションを大切に。

音楽にも縁があります。好きな音楽、リラックスする音楽、美しい音楽を聴いて過ごしてみたり、実際演奏してみるものオススメです。

「白い魔法使いの13日間」9日目  

www.mayareki-muluc.com

音9の日。「意図の脈動」キーワード「傾聴」

しっかり聞いて、人々を元気づける。

情熱的で、ワクワク・ドキドキがモチベーションになる日。

好きなこと、自分が喜ぶことを基準に楽しんでみてください。

キーワード「傾聴」とあるように、どんなときも、一度は相手の話を聞いてみることが大切です。

今日は宇宙エネルギーがたくさんふりそそぐ黒KINの日! 

www.mayareki-muluc.com

忙しい日になります。

今日は振れ幅の大きい日なので、うまく流れに乗れば、どんどんいいシンクロが起きます。是非、プラスのイメージで、ネガティブに傾かないようにしましょうね。

黒KINの濃い〜エネルギーを味方につけて前向きに行動しましょう☆

------------------------------------------

以前、7、8年前のリバイバルについて書いています。

www.mayareki-muluc.com

年末くらいからリバイバルというのが自分の中にきていたのですが、なるほどと思ったのが、加藤由迦さんのこちらの記事↓↓↓

ameblo.jp

なるほど、自分自身の純粋な輝きをいかに拡大できるか、そのための準備のひとつとして、「情熱があふれ出るポイントを思い出す」ということがありました。

昨夜は、7〜9年前苦楽をともにしたメンバーで飲みに行きました♪

3年ぶりに会ったのですが、それまでは半年に一度のペースで集まって飲む仲間でした。だいたい5、6人なのですが、一人を除いてみんなその場所にはもういないんですwとっくに別々の道に進んでいて、それぞれで活躍しています。

久々に会ったら、一人古巣に残っていた人がこの3月で退職し東京に引っ越したそう!

びっくりしました。バリバリ働かれる方なので生涯ここで頑張るのでは?と思っていたから。一緒に働いていた部署で、実に10年勤め、1年前に部署異動し、過度な残業とストレス過多で激やせしたそう。体調も心配なおり、旦那さんの東京転勤を機に辞められお引っ越し。ここ1年激変でしたね。

彼女はこの2月のお誕生日から52歳を迎えられていました!

マヤ暦的節目☆リスタートのとき。

子供さんふたりも手が離れ自活し、まさに自分の役目で生きられるようになったばかり、すべて用意されていたかのようなタイミングでしたね。

このことをお伝えしたら、とても喜んでおられました。

既にやりたいことがいろいろあるそうです。

このことをお伝えするために、私はこの会を企画したのかも♪

大きな転機の前って、やはり揺さぶれることが多いですね。変化を促すためのものだったりしますよね。

自分の現在の立ち位置がわかっていると、いろんなことがあってもブレません。

一見辛いことであっても、その状態が長く続かないことを知っているから。

一見辛いことも、長いサイクルで見ると、そのポイントが大きな転機になっていたりします(後から振り返ると)。

いろいろな出来事を通し、いろんな感情を味わうために用意されているのです。

ただ味わい、感じる。

彼女も、リスタートを前に、異動→体調不良→退職→引越と、自分の人生を設定していましたよね。

すごいな〜面白いなぁ。そんな感動を私も味わいました。

久々に会えて嬉しかったし楽しかったです♪ありがとう。

あらゆるものが振動し、微細な呼吸をしていることを感じましょう。今日は、自分と万物の呼吸を感じ、共に息を合わせ、ひとつになる感覚を得ましょう。自然界に謙虚になり、感謝を学びましょう。

インラケッチ!今日も素晴らしい一日を♪

 

 \【キャンペーン】機嫌よく生きるためにマヤの暦を活用するセッション/ 

 6月21日夏至までのキャンペーンです☆

ご好評につき、キャンペーン終了後も受けていただけますが、キャンペーン価格は今だけ!

www.mayareki-muluc.com

 

 \セッション・お茶会・講座承ります/   

www.mayareki-muluc.com

 

 >>お申し込みはこちらから!

  

 

マヤ暦ライフクリエイター☆山下千草

------------------------------------------------

お問い合わせ、ご質問はお気軽に!

mayamuluc249☆gmail.com

☆を@に置き換えてください

 

 

本日は満月あけの月曜日。

 

月は乙女座を移動し、お昼過ぎには天秤座へ移動します。

 

本当のことを探る、さがしてみるよりも

未来にそうなるように夢見てみよう。

よりよいものであるように願い、行動しよう。

 

世界を巻き込んで自分自身をそこに練り込んで

こねてこねて。

未来を創造しつづけよう。

 

 

コダマ凜

http://kodamarin.net

 

 

 

 

 

 

「創意と工夫に満ち溢れている、世界15の面白バス停」http://p.tl/Gssm

再帰関数

2018/03/10

関数の中で、再びその関数自身を呼び出すことができ、こういう関数を再帰関数と呼ぶ・・・。
これを使うことで、ループ処理をより簡潔に記述できる・・・。

渡された値を階乗した値を返す関数factorialを定義する・・・。

その前にmain関数は、

こうなっている・・・。
入力された値をfactorialに渡して、階乗した値が返ってくるのでそれを出力・・・。

factorialは再帰関数で表現すると、

こんな感じで、0より大きい場合は、n * factorial(n - 1)を返し、0の場合は、1を返す・・・。

このようにfor, while, do-whileを使わずに繰り返し処理が書ける・・・。

実行すると、

$ vi recursion.c
$ gcc recursion.c -o recursion
$ ./recursion
x: 1
factorial(1) = 1
$ ./recursion
x: 2
factorial(2) = 2
$ ./recursion
x: 3
factorial(3) = 6
$ ./recursion
x: 4
factorial(4) = 24
$ ./recursion
x: 5
factorial(5) = 120
$

こんな感じで階乗した値が返ってくる・・・。

Sample/recursion.c at master · bg1bgst333/Sample · GitHub

富士急ハイランドの回転ブランコ

鉄骨番長

 

で急に運転が停止するという事故があったようです。

 

f:id:AR30:20140316090716p:plain

スポンサーリンク

★乗客は男女23人

★救助されるまで約1時間15分、地上23メートルの高さで宙づりに

★けが人はなし

★鉄塔が上昇した後に回転し、ブランコが鉄塔の周りを回転する遊具

★乗客を乗せて鉄塔が上昇し、回転を始めた直後に停止した

 

★運転を制御するケーブルが断線したことが停止の原因とみられる

★ケーブルは10日朝の点検で異常は見つからなかった

 

ということで・・

 

いつも言いますが

いつ大事故が起こっても不思議ではありません・・

Qです。

きのうは3.11。

 

3年前はお客さんとの打ち合わせ中に地震が起き、 お客さんと机の下に隠れました。

日本人の常識が変わってしまった日でしたね。

いろいろな思いがあります。。。

 

さて、今日は我が家の雪止め について。

きのうも降りました

DCIM0558.jpg

積雪は約20cm。アプローチは10cmぐらいかな。

 

滋賀県のくせにいつまで降るんじゃ~

はい、このくらい降ると、雪庇が…

DCIM0559.jpg

できます。 雪止めがあるのに。。。

 

我が家の雪止め DCIM0528.jpg

下のほうに1段だけ

これが失敗でしたね~。

 

 ≪広告≫

   

 

ちなみに、写真真ん中らへんの木の枝は、前回の大雪の落雪で折れました 雪止めが下のほうにしかないので…

DCIM0564.jpg

こんなふうに、屋根の雪全体がずれちゃいます。

こうなると下の雪止めだけでは止まりません

そのうち雪崩が発生します。

 

我が家は、平屋で屋根が大きい&5.5寸勾配(急勾配)屋根なので、 真ん中ぐらいにもう1列、雪止めが必要でした。。。

 

いつまでも屋根からの落雪が解けないし…

DCIM0529.jpg

雪止め。やっぱりちゃんとあったほうがいいような気がします。

お金ができたら、雪止めを追加する工事をしたほうがいいのかなぁ…

 

いいや、この際、太陽光の屋根にするか… 早く春になって雪の悩みから解放されたいものです。 

 

ポチお願いします!

ブログランキング・にほんブログ村へ
にほんブログ村

ABC014D-閉路

2018/03/10

問題

問題概要

木のグラフが与えられる。その木に対して、辺を1つ加えでできる、閉路の長さを答える。

解法

まず、LCAを求める。LCAについては、蟻本。多くのクエリが与えられるので、いちいち親をたどっていては、間に合わない。そこで、頂点vから、2k回上に廻った頂点を記録しておく。parent[k][v] := vから2k回上に廻ったときの頂点とおき、前計算で計算しておく。この計算はダブリングで高速に求めることができる。

ミス

LCAを利用するのね。

コード

#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
#define rep(i,n) for(int i=0;i<(n);i++)

class Tree_lca{
public:
    Tree_lca(int V, int root) : V(V), root(root){
        G.resize(V);
        for (int i = 0; i < MAXLOG_V; ++i) parent[i].resize(V);
        depth.resize(V);
    }

    //u-vをunite
    void unite(int u, int v){
        G[u].push_back(v);
        G[v].push_back(u);
    }

    void init(){
        //parent[0]とdepthを初期化
        dfs(root, -1, 0);
        //parentを初期化 2^kごとのテーブルを作成
        for (int k = 0; k + 1 < MAXLOG_V; ++k){
            for (int v = 0; v < V; ++v){
                if(parent[k][v] < 0) parent[k + 1][v] = -1;//root(rootより上)が親
                else parent[k + 1][v] = parent[k][parent[k][v]];//ダブリングで2倍上の親を求める
            }
        }
    }

    //u, vのLCAを求める
    int lca(int u, int v){
        //uとvが同じ深さになるまで親を辿る
        if (depth[u] > depth[v]) swap(u, v);
        for (int k = 0; k + 1 < MAXLOG_V; k++){
            //uがvと同じ高さになるまで親を辿る
            if (((depth[v] - depth[u]) >> k) & 1) {
                v = parent[k][v];//bitが立っていれば、親を2^k辿っていく
            }
        }
        if (u == v) return u;
        //2分探索でLCAを求める LCAより上の親(LA)は常に同じになる
        for (int k = MAXLOG_V - 1; k >= 0; k--) {
            if (parent[k][u] != parent[k][v]){//LCAにたどり着く限界まで、上を目指せばいい
                u = parent[k][u];
                v = parent[k][v];
            }
        }
        return parent[0][u];//1つ上がLCA
    }

    //1つ上の親と深さを設定
    void dfs(int v, int p, int d){//ノード番号 親のノード番号 深さ
        parent[0][v] = p;
        depth[v] = d;
        for(auto u : G[v]){
            if(u != p) dfs(u, v, d + 1);
        }
    }

    // uとvの距離をlcaを利用して求める
    int dist(int u, int v){
        int p = lca(u, v);
        //u-vの距離 
        return (depth[u] - depth[p]) + (depth[v] - depth[p]);
    }
    static const int MAXLOG_V = 25;
    vector<vector<int> > G;//隣接リスト
    int V, root;//頂点数と根
    vector<int> parent[MAXLOG_V];//親を2^k辿って到達する頂点(通り過ぎると-1)
    vector<int> depth;//根からの深さ
};


int main(void){
    int n; scanf("%d", &n);
    Tree_lca tree(n, 0);//頂点数 rootの頂点番号
    //unite
    rep(i, n - 1){
        int x, y; scanf("%d %d", &x, &y);
        x--; y--;
        tree.unite(x, y);
    }
    //初期化   
    tree.init();

    int q; scanf("%d", &q);
    rep(i, q){
        int a, b; scanf("%d %d", &a, &b);
        a--; b--;
        printf("%d
", tree.dist(a, b) + 1);
    }
    return 0;
}
/*
閉路の長さを求める。最小共通祖先(LCA)を利用するといい
LCA -2つの頂点の共通の祖先(親を巡って辿り着ける頂点)
それぞれの頂点について、2^k個前の親を予め計算しておく(テーブルを作る)
テーブルの作り方
    ex)2回親を巡った時に到達する頂点parent2[v]=parent[parent[v]]
    ex)4回親を巡った時に到達する頂点parent4[v]=parent2[parent2[v]](上の情報をつかって)
    parent2^(k+1)[v]=parent2^k[parent2^k[v]] (kが小さい場合から全頂点について逐次計算していけばもとまる)
    ある頂点xの2^(k+1)個前の親 = (xの2^k個前の親)の2^k個前の親
*/

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
typedef pair<int,int> pint;
typedef vector<int> vint;
typedef vector<pint> vpint;
#define mp make_pair
#define fi first
#define se second
#define all(v) (v).begin(),(v).end()
#define rep(i,n) for(int i=0;i<(n);i++)
#define reps(i,f,n) for(int i=(f);i<(n);i++)
 
class Tree_lca {
public:
    //コンストラクタ
    Tree_lca(int V, int root) : V(V), root(root) {
        //resuze(V)はVの大きさ分メモリ領域を確保することで高速化
        T.resize(V);
        for (int i = 0; i < MAXLOGV; i++) parent[i].resize(V);
        depth.resize(V);
    }
 
    // uとvをつなぐ
    // lcaを求めることが主目的なので無向グラフとしている
    void unite(int u, int v) {
        T[u].push_back(v);
        T[v].push_back(u);
    }
 
    // initする
    // コンストラクタだけじゃなくてこれも呼ばないとlcaが求められないぞ
    //dfs+2^k祖先を計算
    void init() {
        //深さと親を設定
        dfs(root, -1, 0);
        //2^kずつのテーブルを作る
        for (int k = 0; k+1 < MAXLOGV; k++) {
            for (int v = 0; v < V; v++) {
                //rootより上(存在しないところ)には-1
                if (parent[k][v] < 0) parent[k+1][v] = -1;
                //dpで親を計算していくテーブルを作成
                else parent[k+1][v] = parent[k][parent[k][v]];
            }
        }
    }
 
    // uとvのlcaを求める
    int lca(int u, int v) const {
        if (depth[u] > depth[v]) swap(u, v);
        for (int k = 0; k < MAXLOGV; k++) {
            if ((depth[v] - depth[u])>>k & 1) {
                v = parent[k][v];
            }
        }
        if (u == v) return u;
        for (int k = MAXLOGV-1; k >= 0; k--) {
            if (parent[k][u] != parent[k][v]) {
                u = parent[k][u];
                v = parent[k][v];
            }
        }
        return parent[0][u];
    }
 
    // uとvの距離をlcaを利用して求める
    // edgeを定義しないといけない時はこれじゃダメ
    int dist(int u, int v) const {
        int p = lca(u, v);
        //答えはuの深さ + bの深さ - aとbのLCAの深さ + 1
        return (depth[u]-depth[p]) + (depth[v]-depth[p]);
    }
 
    //深さと親を確認
    void dfs(int v, int p, int d) {//root,-1,0
        parent[0][v] = p;
        depth[v] = d;
        for (int next : T[v]) {
            if (next != p) dfs(next, v, d + 1);
        }
    }
 
    static const int MAXLOGV = 25;
    // グラフの隣接リスト表現
    vector<vector<int> > T;
    // 頂点の数
    int V;
    // 根ノードの番号
    int root;
 
    // 親ノード
    vector<int> parent[MAXLOGV];
    // 根からの深さ
    vector<int> depth;
};
 
int main(void){
    int n; scanf("%d", &n);
 
    //頂点の数をn 根ノードの番号を0として呼び出す
    Tree_lca tree(n, 0);
    //uniteする
    rep(i, n - 1){
        int x, y;
        scanf("%d %d", &x, &y);
        x--; y--;//0オリジンに
        tree.unite(x, y);
    }
    //inittする
    tree.init();
 
    int Q; scanf("%d", &Q);
    rep(i, Q){
        int a, b;
        scanf("%d %d", &a, &b);
        a--; b--;
        //答えは
        printf("%d
", tree.dist(a, b) + 1);
    }
    return 0;
}

 2015年もいよいよ大晦日。

初売りで靴を買うならシューズボックス(下駄箱)に新しい靴を収納するスペースを確保しておきたいところです。

 

今回は、シューズボックスの収納術についてです。

 

 シューズボックスの各段における高さのピッチ(間隔)に注目

シューズボックスをイメージした図を描いてみました。

シューズボックスが複数の仕切り板で複数の段に分割されています。

f:id:chienokobako:20151231160111j:plain

 

 左側のシューズボックスと右側のシューズボックスでは、同じ数の靴(五角形で表記)が収納されています。

左側のシューズボックスでは、高さのピッチ(仕切り板の間隔)を一定にしています。

家の引き渡し直後はこのような状態でしょうね。

 

靴の高さに関係なく、高さのピッチを一定にしていると、見た目はいいのですが、それぞれの段に無駄なスペースが生じてしまいます。

左側のシューズボックスの最下段のように、ブーツを立てられないからという理由で寝かせて収納したりすると、スペースの効率は最悪です。

 

 シューズボックスの高さのピッチを靴に合わせて変更する

上の絵の右側のシューズボックスでは、靴の背の高さに合わせて各段の高さのピッチを調整しています。

つまり、靴の上端と上の段の仕切り板までの隙間が小さくなるようにしています。

すると、新しい靴を収納するための新たなスペースが発生します。

あら不思議。

 

同じような高さの靴を同じ段に収納する

 シューズボックスの高さのピッチを調整する場合、同じ段には似たような背の高さの靴を収納すると効率的です。

 

長靴を収納する段の例・・・

f:id:chienokobako:20151231161238j:plain

 我が家は田舎なので長靴が必須ですが、収納を占領するのが悩み。

 

このような背が高い靴を収納する段をつくると、仕切り板を抜く必要があるので仕切り板が余ります。

 

余った仕切り板は、背の低い靴を多く収納するために使います。

f:id:chienokobako:20151231162428j:plain

このように、靴の出し入れがしやすい程度に高さのピッチを調整してやると、

おそらく靴の収納量が2~3割程度アップするのではないかと思います。

 

 ≪広告≫

   

 

 シューズボックスの仕切り板のピッチを変更する作業は、かなり面倒ではあります。

しかし、収納効率の向上を実感することができますので、新しい靴を買いたくなったときなんかに是非、実践してもらいたいなぁと思います。

 

シューズボックスの記事で今年の更新は終了です。 

本年もありがとうございました!良いお年を! 

 

ポチお願いします!

ブログランキング・にほんブログ村へ
にほんブログ村

今回は数学っぽい記事です。
2ちゃんまとめブログで見て気になったのでw



前回の名言:「いちまん」




まず0の0乗はどのように定義されているか

答えは「定義されない」だそうです。

定義すれば1だそう。

1にして例をだすと

みかんがありませんでした。

みかんを消しました。

みかんが生まれました。

強烈な違和感

真面目にいうと


2²

2の2乗は正確には1に2を2回かける。

だから1×0×0=1

やはり強烈な違和感

1に何もしないから1だそう。


それでは他の数はどうなるのか?

2の0乗は1
1に2をかけないから1。

同じようにしたのでしょうね。

どんな数でも0乗すれば1になるので都合がいいそうです。


0の0乗=1=ビッグバン

これはビッグバンに似ていますね。


宇宙は何もないところからビッグバンによりできた。

宇宙の前は「無」だった。

無の状態から何かがおき宇宙が生まれる。

もし0の0乗がきちんと定義されたなら宇宙科学が解明するかもしれませんね。

結論

1の0乗は1。または定義できないが正解。

僕的の答えは「無」にします。


スレを開く前に考えたのが「無」なんですもんw

1に何もかけないから1。

じゃあ0に何もしないから0?


謎が深まりますね。






かがくのちからってすげー

以上。