OmniAICreator/Qiita-1.07M huggingface dataset:
個人的beamer.cls用プリアンブル

以下の画像のようなプレゼンスライドを作るためのbeamer.cls用プリアンブルです

![Screenshot at 2019-09-03 05-03-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259309/b2f236c3-be97-5cd8-40de-2da2d86245b3.png)

```latex
\RequirePackage[TU]{fontenc} % luatex で fontspecでフォント指定するならTUでよい
\RequirePackage{fix-cm} % cmの変なデフォルトの修正。これはdocumentclassの前に読む
\RequirePackage{lmodern} % そもそもデフォルトフォントをcmにする必要はない
\documentclass[luatex, % TeXの種類を指定すると読み込むパッケージの誤判断を避けられる
  unicode, % 理由は https://qiita.com/zr_tex8r/items/69e8cc32038ff29f5ac3
  xcolor=dvipsnames, % 色指定で使える名前を増やしたい
  noamsthm,noamssymb, % AMSのパッケージをbeamer.clsが読まなくていいから
  notheorems, % 定理環境を使わないから
  professionalfont] % 数式フォントをbeamer.clsに置き換えてほしくないから
              {beamer}
% ↓日本語組版のための定番。disablejfamは数式内での日本語フォントが不要だから
\usepackage[disablejfam]{luatexja}
\usepackage{unicode-math} % STIX Two数式フォントを使いたいから
\usepackage{luatexja-fontspec} % 日本語フォント変更コマンドのため
\usepackage{tikz} % 吹き出しを使いたいから
\usetikzlibrary{shapes.callouts} % 吹き出しを使いたいから

\usetheme{Madrid} % 好きなものに変えてください
% 以下のsetmainfontで選ぶフォントを使う。次の行を除くとsetsansfontのフォントになる
\usefonttheme{serif} 
\setbeamercovered{transparent=30} % 消えている文字をうっすらと表示する
\setbeamertemplate{navigation symbols}{} % 右下のアイコンを消す
\setbeamertemplate{enumerate items}[square] % 番号付き箇条書きを四角にする

% ↓絵文字を含むフォントを選ぶ
\setmainfont{Segoe UI Emoji}[
  RawFeature={colr=true;+dist;+ccmp},
  BoldFont={Segoe UI Bold},
  ItalicFont={Segoe UI Italic},
  BoldItalicFont={Segoe UI Bold Italic}]
% ↓数式をSTIX Twoフォントにする
\setmathfont{STIX Two Math}

% プロポーショナル組をする https://qiita.com/zr_tex8r/items/0512dd43e9806483013a
\defaultjfontfeatures{YokoFeatures={JFM=prop},Kerning=On,
  CharacterWidth=Proportional,Ligatures={Common,TeX}}
% ↓UD (Universal Design)フォントを日本語に用いる
\setmainjfont[
  ItalicFont={UD Digi Kyokasho NK-R},
  ItalicFeatures={FakeSlant=0.2},
  SlantedFont={UD Digi Kyokasho NK-R},
  SlantedFeatures={FakeSlant=0.2},
  BoldFont={UD Digi Kyokasho NK-B},
  BoldSlantedFont={UD Digi Kyokasho NK-B},
  BoldSlantedFeatures={FakeSlant=0.2},
  BoldItalicFont={UD Digi Kyokasho NK-B},
  BoldItalicFeatures={FakeSlant=0.2}]{UD Digi Kyokasho NK-R}
\setsansjfont[ItalicFont={BIZ UDPGothic},
  ItalicFeatures={FakeSlant=0.23},
  SlantedFont={BIZ UDPGothic},
  SlantedFeatures={FakeSlant=0.23},
  BoldFont={BIZ UDPGothic Bold},
  BoldSlantedFont={BIZ UDPGothic Bold},
  BoldSlantedFeatures={FakeSlant=0.23},
  BoldItalicFont={BIZ UDPGothic Bold},
  BoldItalicFeatures={FakeSlant=0.23}]{BIZ UDPGothic}

\begin{document}
\begin{frame}[t]{絵文字も使えます👌}
  \textit{イタリックitalic}\\
  \textbf{ボールドbold}

  \begin{tikzpicture}
    \node [ellipse callout,draw, text width=2cm, callout relative pointer={(-0.5,-1)}] at (0,1.5) {吹き出しだよ😃 $e^{i\pi} = -1$};
  \end{tikzpicture}\\
\end{frame}
\end{document}

```

参考文献

* [今さら人に聞けない「日本語でBeamer」のキホン](https://qiita.com/zr_tex8r/items/69e8cc32038ff29f5ac3)
* [Beamer の基本的な使い方のサンプル](http://math.shinshu-u.ac.jp/~hanaki/beamer/beamer.html)
* [Beamer User Guide](http://tug.ctan.org/macros/latex/contrib/beamer/doc/beameruserguide.pdf)
* [TeXでつくるプロポーショナル組日本語文書](https://qiita.com/zr_tex8r/items/0512dd43e9806483013a)
サクラエディタマクロ操作での処理を一括での「元に戻す」(Redo,Undo)に対応させる

「マクロを実行したけど間違えちゃった、マクロを修正してデータは戻したい」という場合に、Redo/Undo「元に戻す」「やり直し」で元に戻したいですよね。
しかし、入り組んだマクロで複数回処理をしていると、一度の操作で戻すことができません。
データがファイルに保存されているならいいですが、必ず保存しているとは限らないため、たまに「元に戻す」を大量に実行しないといけない、というときが出てきます。
またマクロ中で「保存」を呼んでいる場合も、戻すのが大変です。

そういうのを避けるために「Redo/Undo操作をまとめるためのマクロ」が存在しています。

マクロ処理をエディタのいち機能のように見せるためにも便利です。

今回サンプルとして使うのは前回改良したマクロを元にさらに改良したいと思います。

```JavaScript:sample_macro_draw_switch2.js
var i;
var draw_old = Editor.SetDrawSwitch(0);
for (i = 1; i <= 1000; ++i) {
    Editor.InsText(i + '\r\n');
}
Editor.SetDrawSwitch(draw_old);
if (draw_old) {
    Editor.Redraw(0);
}
```

Redo/Undoの記録を操作するには`AddRefUndoBuffer`と`SetUndoBuffer`を組にして使います。
https://sakura-editor.github.io/help/HLP000268.html#SetUndoBuffer

```JavaScript:sample_macro_redo.js
var i;
var draw_old = Editor.SetDrawSwitch(0);
Editor.AddRefUndoBuffer(); // ※まとめる開始
for (i = 1; i <= 1000; ++i) {
    Editor.InsText(i + '\r\n');
}
Editor.SetUndoBuffer(); // ※まとめる終了
Editor.SetDrawSwitch(draw_old);
if (draw_old) {
    Editor.Redraw(0);
}
```
基本はこのように、まとめたい処理の前後にそれぞれの関数を追加するだけで、Undo「元に戻す」一回の操作で、関数直前のデータに戻ります。
万が一`SetUndoBuffer`を呼び忘れても、マクロの終了時に自動的に元の状態に戻る保険機能があるのため、大丈夫です。実行途中でエラーで止まった場合も同様です。

この処理が必要なケースはあまりありませんが、覚えて対応しておくと、何かあったときに、すぐに元に戻せて比較的安全にマクロを使えます。


よいサクラエディタライフを！
サクラエディタの遅いマクロを高速に実行する

#サクラエディタのキーマクロ実行が遅い
サクラエディタで複数回の「カーソル移動」「挿入」「置換」などを繰り返すマクロを実行すると、びよーんと編集画面が更新されて、作業内容が見れるような感じでかなり遅いときがあります。
見れるので安心という一方、さっさと終わってほしい場合のほうが多数派だと思います。

そういう多くの場合に応用できる、ちょいテクニックを紹介します。

いざゆかん、スピードアップじゃ。

##遅いマクロ例
まずマクロはJScript(\*.js)で紹介します。
キーマクロ(\*.mac)だった場合は「`S_`」を削除して、js用に修正してください。
「`Editor.`」は現バージョンではあってもなくても問題ないです。これはJavaScriptでwindowを省略できるのと同じです。

実用的ではないですがサンプルとして「1」から「1000」まで1行ずつ挿入するマクロを書いてみます。

```JavaScript:sample_macro.js
var i;
for (i = 1; i <= 1000; ++i) {
    Editor.InsText(i + '\r\n');
}
```
マクロとして実行すると、びよーんと数字が並んだドキュメントができると思います。
また、副作用として「Redo/Undo」バッファが1回ごとの挿入毎に行われるため、1ステップで元に戻せないというのも不便です。
実行してみたら、5秒ぐらい掛かりました。

##解決策その1：一度に挿入する
基本的にサクラエディタは、画面描画処理があまり速くありません。また挿入などの処理も複数回行うと、あまり速くないです。一度にしたほうが高速に動作します。
これはバージョンとか関係なく、jsが実行できるバージョンならほぼ使えます。

```JavaScript:sample_macro_onece.js
var i;
var ins_data = '';
for (i = 1; i <= 1000; ++i) {
    ins_data += i + '\r\n';
}
Editor.InsText(ins_data);
```
実行してみると、ほぼ一瞬で動作します。
`TraceOut`マクロも使うことがありますが、同様に1行ずつ表示するより、面倒ですが自前でバッファリングして、一度に出力すると、びっくりするほど高速化します。

##解決策その2：画面更新処理を省略する
一度に更新できればいいですが、一カ所ではなく離れている場所の修正だったり、カーソル移動や各種機能を呼び出したり、エディタの複数回置換では、一度にデータ更新というわけにはいきません。
そういう場合のテクニックとして、画面描画処理を「さぼる」ことを指示できるようになっています。
この`SetDrawSwitch`マクロはサクラエディタ ver2.1.0.0 以上で使えます。
https://sakura-editor.github.io/help/HLP000268.html#SetDrawSwitch
最小限のサンプルは下記です。

```JavaScript:sample_macro_draw_switch1.js
SetDrawSwitch(0);
var i;
for (i = 1; i <= 1000; ++i) {
    InsText(i + '\r\n');
}
SetDrawSwitch(1);
Redraw(0);
```
`SetDrawWsitch`で非表示にした場合、何か画面内容を変更したら、現在のバージョンでは自前で`Redraw`(再描画)をする必要があります。
マクロ開発中などで更新されなかったときは`F5`キーで再描画させることもできます。

もう少し細かいことも考慮したいと思います。
次のコードでは、`draw_old`で元の値を取得して`Redraw`するか決めています。
これは、このマクロ実行の再描画だけでなく、マクロ自体が100回繰り返しとかで他のマクロなどから呼ばれていて、元から非表示だった場合に、100回再描画して遅くなるのを防ぐことができます。

```JavaScript:sample_macro_draw_switch2.js
var i;
var draw_old = Editor.SetDrawSwitch(0);
for (i = 1; i <= 1000; ++i) {
    Editor.InsText(i + '\r\n');
}
Editor.SetDrawSwitch(draw_old);
if (draw_old) {
    Editor.Redraw(0);
}
```

どうでしょうか。こちらも、一瞬または1秒程度で実行できました。

##SetDrawSwitchの問題点
`SetDrawSwitch`による処理の省略は、カーソル移動などで一部のバージョン機能にバグがあるときがあります。
その問題を回避できない場合は、`SetDrawSwitch`による改善はうまくいかないかもしれません。
ご注意ください。

##Grepのリアルタイム表示
マクロではありませんが、Grep出力の結果を表示する際にも「リアルタイム表示」という機能があります。
デフォルトではOFFですが、ONにしていて遅いというときは、大量にGrepする場合にはOFFにすると、ONのときよりは素早く表示することができます。
逆に、大量のテキストの中から検索するものの「1つ見つけたらそれでいい」場合には、ONにすると、中断などを併用して素早くGrep検索からタグジャンプなどをすることもできます。
`共通設定`＞`検索`タブ＞`リアルタイムで表示する`、でデフォルト値を変更することができます。

サクラエディタのマクロの実行が遅くてかなわない、という人、ぜひお試しください。
よきサクラエディタライフを！
10分でWindows10にgitをインストール

## Gitインストール

Nextで進めていくだけで簡単にインストールできました。 
詳細は下記のqiita記事がわかりやすかったです。
[自分用 Git For Windowsのインストール手順](https://qiita.com/toshi-click/items/dcf3dd48fdc74c91b409)

### WindowsのGUIインストーラをダウンロード
[ダウンロードページ](https://git-scm.com/downloads)

### インストーラー実行
ダウンロードが完了したら実行します。
あとはNextを押していきます。
![w-git1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354517/6d60c5e5-6430-ee8f-5b3f-909306e78189.png)

### インストールするフォルダの選択
![w-git2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354517/c15cb0e9-8feb-4a27-3a36-9c3ca2acc0f8.png)

### インストールするコンポーネント
![w-git3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354517/9fafeba5-3609-222c-9523-936da5b03128.png)

### メニューフォルダを選択
![w-git4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354517/afb76d4b-918d-9a48-8d19-70c8463948b3.png)

### gitで使用するエディタの選択
![w-git5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354517/8a1ddde8-df64-b207-c8e8-bc936a30caef.png)

![w-git6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354517/37ce6ab0-0759-1c58-dd39-187d2916ef7c.png)

### PATHの設定
![w-git7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354517/5e3cc586-60d1-8e5b-7283-5e4ac1848a6d.png)

### SSHクライアントを設定
![w-git8-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354517/7e165807-a67a-cea1-4304-b2df71e32330.png)

### HTTPS接続の設定
![w-git9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354517/5dea25cd-be7c-c934-776d-a7a7bea9c18a.png)

### 改行オプションの設定
![w-git10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354517/8c84c47a-1666-abe4-62d1-0a4af9c32a2f.png)

### 使用ターミナルの設定
![w-git11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354517/635dcd7a-13aa-d754-b4db-eed9116069a7.png)

### 拡張オプションの設定
![w-git12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354517/80d89bc3-9ee3-13f9-502d-31aeb5915549.png)

### 最新機能の追加設定
![w-git13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354517/bf3b34cf-19a2-1d8c-8a55-a728b4535fee.png)

### インストール完了!
![w-git14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354517/61931c77-6b47-458c-aded-f95e47263865.png)

## 最後にgitバージョン確認

インストールできました。

```
>git --version
git version 2.23.0.windows.1
```
rails test が RuntimeErrorで失敗する(Queue not empty, but all workers have finished.)

## RuntimeError発生

Rails6で `rails test` してみると下記のようなエラーが発生。

```
$ rails t
Running via Spring preloader in process 3232
Run options: --seed 48688

# Running:

/Users/amatsuki/programing/portfolio/study_roadmap/db/schema.rb doesn't exist yet. Run `rails db:migrate` to create it, then try again. If you do not intend to use a database, you should instead alter /Users/amatsuki/programing/portfolio/study_roadmap/config/application.rb to limit the frameworks that will be loaded.
/Users/amatsuki/programing/portfolio/study_roadmap/db/schema.rb doesn't exist yet. Run `rails db:migrate` to create it, then try again. If you do not intend to use a database, you should instead alter /Users/amatsuki/programing/portfolio/study_roadmap/config/application.rb to limit the frameworks that will be loaded.
Traceback (most recent call last):
        5: from -e:1:in `<main>'
        4: from /Users/amatsuki/.rbenv/versions/2.6.4/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        3: from /Users/amatsuki/.rbenv/versions/2.6.4/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        2: from /Users/amatsuki/.rbenv/versions/2.6.4/lib/ruby/gems/2.6.0/gems/minitest-5.11.3/lib/minitest.rb:63:in `block in autorun'
        1: from /Users/amatsuki/.rbenv/versions/2.6.4/lib/ruby/gems/2.6.0/gems/minitest-5.11.3/lib/minitest.rb:140:in `run'
/Users/amatsuki/.rbenv/versions/2.6.4/lib/ruby/gems/2.6.0/gems/activesupport-6.0.0/lib/active_support/testing/parallelization.rb:118:in `shutdown': Queue not empty, but all workers have finished. This probably means that a worker crashed and 5 tests were missed. (RuntimeError)
```

## 対処法

下記コマンドで解決。

```
rails db:migrate
```

エラー文の上の方を見てみると、
schema.rb がないので `rails db:migrate` して作ってねと書いてありました。

```
/Users/amatsuki/programing/portfolio/study_roadmap/db/schema.rb doesn't exist yet. Run `rails db:migrate` to create it, then try again. If you do not intend to use a database, you should instead alter /Users/amatsuki/programing/portfolio/study_roadmap/config/application.rb to limit the frameworks that will be loaded.
```
A-FRAME: 360°画像ビュアーの作成


旅行に行ってきたので、その時の360°画像をVRゴーグルで見れるようにしてみました。
先日ちょこっとさわったので、A-FRAMEを利用してみました。

リンクにカーソルを合わせると3枚の画像が順番に切り替わっていきます。
[demo](https://k38.github.io/aframe/transition/)


## こまったこと

### ジャイロ問題

iOS12.2以降でジャイロセンサーがOFFになってます。
[iOS 12.2でWebVRとWebARが半ば終わった件について](https://qiita.com/ikkou/items/a193d13250d9e3d51473)

私のiPhoneSEはiOS12.4.1なので設定変更が必要でした。
`設定 > Safari > モーションと画面の向きのアクセス` をONにしました。

### それでも動いたり動かなかったり問題

最初は、VRモードで動作確認できたサイトのコードを丸パクリしました。
そのコードをVSCodeのLiveServerというExtensionで実行すると動作しませんでした。

確かな情報は見つけられていないのですが、どうやら上記設定をONにしても、プロトコルがhttpだとジャイロセンサーのデータが取得できないようでした。    
LiveServerの設定を変更し、httpsで起動するようにしたら動作するようになりました。
[Live Server for Visual Studio Code で HTTPS を有効にする](https://qiita.com/ma2shita/items/297c812a6cd09b5e82c8)

### リンクの実装

はじめ、A-FRAMEが標準で用意しているa-linkという機能で、リンクを実装しました。
画像部分が赤みがかるので、どこにリンクするのかよくわからない状態になりました。
![a-link.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/71eab06d-fc54-9944-a3b2-4a4be87e5773.png)
赤みがかるのを変えたかったのですが、そういった[アトリビュート](https://aframe.io/docs/0.9.0/primitives/a-link.html)はなさそうなので、a-circleで無理やりつくりました。

a-linkとさほど違和感なくできたのではないかと思います。

## 今後の課題

- 画像がパッときりかわるので、かっこいいエフェクトとか欲しいです。
- リンクはすこし動いてる方が目立ちそうなので、もう少し工夫します。
[React Native] 配列要素をループで表示する

# 概要  
通常render()のreturn内ではfor文を書けないが、配列で管理されてるデータをText等で出力したい。

# 実装  
``` TypeScript:Sample.tsx
export class Sample extends React.Component {
  render() {
    var alphabet = ["A", "B", "C", "D", "E"];

    return (
      <View>
        { 
          alphabet.map( data => { return (<Text key={data}>{data}</Text>) } ) 
        }
      </View>
    );
  }
}
```

- {}で括っても、ifやforなどのロジックは呼び出せない。
- 関数呼び出しは可能なので、mapを仕様してループ処理する。
- ただし警告がでるので、keyを指定する。
- keyは一意の値でなければならない。


# 終わりに
早い話が、mapを使おうなって話でした。
最初はreturnの前で予め表示用のデータを配列で作るという方法を考えていたのだが、普通にパフォーマンスが悪い。

``` TypeScript
export default class Sample extends Component {
  render() {
    var alphabet = ["A", "B", "C", "D", "E"];
    var Views: any[] = [];
    for (let i = 0; i < alphabet.length; i++) {
      Views.push(
        <View>{alphabet[i]}</View>
      );
    }

    return (
      <View>
        {Views}
      </View>
    );
  }
}
```
SphinxのreStructuredtextによるGodot記事執筆方法

今までの派遣社員としては、C言語やその他プログラミング言語を使ってきた。
最近は、自作キーボードとしてQMKを調べていたが、C言語には関わっていない。
COBOL言語要員として派遣した時、実際の業務はExcelの線引きばかりしていたという仕事とは思えないことにも従事し、いろいろ屈辱的なことにも耐えてきた。
しかし、今はニートだ。
学生時代からゲーム作りに憧れ、ずっとゲームで遊んで勉強から逃げてきた。

もう一度言うが、私は現在ニートだ。
そのため、ゲームを12時間近くしつつ1日の余った時間で勉強をしようと思い立った。
そのときに発生したことをメモ書きにしようと思い立った。

速攻躓いたため、ここにメモを残す。





















# 選んだプログラミング言語
有名とは言いがたい言語を選んだ。
それが `Godot` だ。

その理由は、巷にあふれている言語を選ぶ場合、既に有識者が多いため、注目を集めるのは不可能に近いと思った。
何より、その状態の場合、私が奮起したところで、他の人の方がいいものを作るだろうというやる前から諦めてしまう性格が顔を出し・・・顔どころか体だけで無くその世界が私を覆い尽くし、ゲームに逃げることは分かっている。
そのため、ほぼ情報の無い言語を選ぶことにした。

それでもある程度の日本語情報は出回っているが・・・。




















# どの程度まで理解したか
全く手を付けていないに等しい。
他の勉強と同じように、環境構築をして終わっている状態だ。
なにせ、日本語の情報が無い。

全く手を付けられない状態であり、しかもどこから手を付けていいのか分からないぐらい途方に暮れている状態でもある。




















# どうするのか。
まずは、チュートリアルから取り組む。





















# 今回のQiitaへの記事内容は？
チュートリアルで手に入れた知識をメモに取る。
そのときに利用するのが、 `reStructuredtext` を使う。
略して **rest** と言うようだ。

私の完全なる備忘録であり、他の人の役に立つかどうか分からない。
そもそもGodotに関する記事を書いて興味を持つ人がいるとは思えないorz



## [vimでのreStructuredtext表示](de6657a3a7adc6cd2aae)
先日Vimで執筆した内容をブラウザに表示できるプラグインを導入した。
しかし、画像が表示されず、不便を強いられていた。
今回、コンパイル作業から生成したHTMLであれば表示されるのでは無いかと高を踏んだ。
※結論：表示されなかった。
悲しいが、パスの仕方が悪いのかもしれない・・・画像表示がなされないのは、VimプラグインやSphinxコンパイルとは無縁だった。
私の技術不足だ。
⇒safariブラウザからFirefoxブラウザに変更しただけで画像が表示されたという・・・。
しかし、Vimプラグインを使ったFirefox表示でも画像表示がなされないため、やはりプラグインにも問題があるのかもしれない。そもそもmarkdown用のプラグインのはず・・・きっと。













## 躓きポイント
reStructuredtextを使う場合は、基本的にコンパイル作業が発生する。
その理由は、Markdownと同じようにマークアップ言語のような記述方法が可能であり、それを元にHTMLやPDFに変換してくれる機能があるのも特徴だ。

そのときの記事に、ソースコードを埋め込めるのだが、言語ごとの細かい指定ができる。
そして、Godotは無名だからなのか、reStructuredtextには、標準でGodot用のソースコード記載を許していない。
そのため、別途準備する必要が出てくる。

その準備に躓いた。

## コンパイルエラー
Godotに関するプログラムがSphinxにないため、以下のエラーが発生する。
`ModuleNotFoundError: No module named 'gdscript'`

メモ内容は以下の通り。

```rst:memo.rst
.. tabs::
 .. code-tab:: gdscript GDScript

	extends Area2D

	export var hoge = 400
```

Sphinxでは、上記の書き方を行う。これで、記事途中にソースコードを埋め込める。
そして、SphinxからこのGDScriptを識別できないため、エラーになる。
（次が本題）

## コンパイル準備
[gdscript.py](https://github.com/godotengine/godot-docs/blob/master/extensions/gdscript.py)を読み込むことでコンパイルエラーを防ぐことができる。
しかし、この注意点として、自分の手でどこかのディレクトリに配置する必要があり、手作業でそれを読み込むようにしなければならないと言うこと。

※[PyPI](https://pypi.org)には存在しないプログラムだからだ。無名というのは実に苦労する。

配置場所は好きにして構わない。
参考URL：[Pythonで「ImportError: No module named …」が出た時の3つの対処法](http://yak-shaver.blogspot.com/2013/07/pythonimporterror-no-module-named-3.html)

### ファイルの読み込み
参考URLから **gdscript.py** を読み込む準備を行う。
Sphinxでは、Pythonを使っているようで、 `conf.py` が設定ファイルになる。
そこに書き込む。

```python:conf.py
import sys
sys.path.append('/Users/chesscommands/godot/gdscript') # gdscript.pyファイルを配置したディレクトリPath
```

これでいい。
私は何を勘違いしたか、ファイル名を含むフルパスを指定してしまい、同じエラーが表示され続けてしまった。
参考URLを参考にしないという・・・。

今回はフルパスを指定したが、相対パスでも問題ないようだ。

### 余談
コンパイルは通ったが、なぜか文字化けしてしまう。

```python:conf.py
language = 'ja'
```

を設定しても解決しなかった。
途方に暮れていたが、ブラウザの表示文字コードを""iso-2022-jp"に変更したとき、一部だけまともな日本語表示がなされた。
そのため、ファイルの文字コードを確認したら"iso-2022-jp-3"とのこと・・・あぁ。

"utf-8"に変更してコンパイルをしたら文字化けせずに表示された。
よかった。



今回の執筆は、[Planck](247fd4c1bb3311a47c77)を使った。
以上。
QMK Firmwareでファームウェアをビルドしようとしたらavr-gccでコケた話

**めっちゃ雑に纏めてます。眠いので許して**

# 結論
最初から`--recurse-submodules`付きでcloneすればいい話でした([公式のGet Started](https://docs.qmk.fm/#/newbs_getting_started)に従いましょう)

```bash
$ git clone --recurse-submodules https://github.com/qmk/qmk_firmware.git
```

# 経緯
以前Redoxを組み立て、その時はMacでファームウェアを焼いたので全く困ることがなかったんですがWindows環境でもビルドできないと困るときが出そうだったので

```bash
$ git clone --recursive https://github.com/qmk/qmk_firmware.git
$ cd qmk_firmware
$ ./util/qmk_install.sh
```
で依存とかインストールして、試しにredoxのファームをビルドしようとしたら

>`avr-gcc`が見つかりません  

みたいなエラーがでて、`avr-gcc`のパスを通せばいいやろとか思ってましたがもっと問題ありました。
(ターミナルの再起動はしました)

# ためしたこと

```bash 
$ find / | grep avr-gcc
```

何も見つからない…(´◔‸◔`)  

~~スクショが見つかりませんでしたごめんなさい~~

# そのあとのこと
なんかqmkに変更が入ってないかGitHubに見に行ったところ、1時間前にちょうど[該当しているIssueのPR](https://github.com/qmk/qmk_firmware/pull/6655)がマージされていたのをみつけたので、  

```bash
$ git checkout master
$ git pull origin master
```
で更新してやりました。

そしてもう一回インストールして`find / | grep avr-gcc`したところ
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320738/6c889d13-f8cd-9586-6f8c-31fdca669628.png)

来たかな？？？？？

その後、進捗をdiscordのSelf-Made Keyboards in Japanのグループに投下したところshelaさんから
>`make git-submodules`してみてください

というアドバイスを貰ったので、実行して再度ファームのビルドコマンドを叩いたところ
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320738/2893551b-3102-d5d7-2c93-1be926461f11.png)

**行ったぞ！！！！！！！！！！よっしゃ！！！！！！１１１１１１１１**  
(shelaさんなど、beginner-helpのチャンネルの方々は深夜にも関わらず協力していただきありがとうございました。)
Libraのコンセンサスアルゴリズム

#0. Libraとは
GAFAの一角を成す「Facebook」を中心とした「Libra協会」によって発行が予定されている暗号通貨。グローバルで使える統一通貨をブロックチェーンで実現することを目標にしている。
「Libra協会」のメンバーとしては、ebay、Spotify、Uber、MasterCard、coinbase、a16z、Booking Holdingsなどが参画を表明している。

>https://libra.org/ja-JP/

#1. コンセンサスアルゴリズムとは

発生した取引を妥当なものとして承認するためのアルゴリズム。
ブロックチェーンなどのP2Pネットワークでは、不正な取引を防ぐための仕組みとして実装され、PoW、PoS、PoI といったものが有名。

PoW : proof-of-work　　 暗号通貨bitcoin、Ethereumで利用
PoS : proof-of-stake
PoI : proof-of-importance　　 暗号通貨NEMで利用

#2. Libraのコンセンスサスアルゴリズム
###2.1.LibraBFT
Libraでは、自らのコンサセスアルゴリズムをLibraBFT(Libra Byzantine Fault Tolerance)と呼ぶ。
Hotstuffというコンセンサスアルゴリズムをベースにして発展させたとのこと。[^1]

>The Libra Blockchain
>5 Byzantine Fault Tolerant Consensus
>https://developers.libra.org/docs/assets/papers/the-libra-blockchain.pdf

###2.2.コンセンサスの流れ

 1. 参加するノードからリーダが選ばれ、リーダがトランザクションからなるブロックを提案する。
 2. リーダはそのブロックを、他の選ばれたノード(バリデータ）に送る。
 3. 受け取ったバリデータは、ブロックの妥当性を確認し、問題がなければ承認する。
 4. リーダはバリデータから承認を確認し、過半数の承認を得た場合、チェーンを更新する
 5. 過半数から承認を得られなかった場合、チェーンは更新されずに次のブロックが次のリーダによって提案される。

現時点のLibraBFTはコンソーシアム型[^2]のブロックチェーンでの利用を前提にしており、コンセンサスアルゴリズムに参加するノードは、Libra協会によって選ばれたメンバーに限られる。

###2.3.LibraBFTの特長

次の長所が見込まれている。

 - ビットコインのPoWに比べて電力の消費が少ない。
 - ビットコインのPoWに比べて承認までの時間が短い
 - 他のコンソーシアム型のコンセンサスアルゴリズム(PBTF[^3])に比べて、バリデータが増えた場合でも通信負荷が小さい。


#3.参考

この記事では以下を参照させていただきました。ありがとうございました。


######HotStuff: the Consensus Protocol Behind Facebook’s LibraBFT
>https://medium.com/ontologynetwork/hotstuff-the-consensus-protocol-behind-facebooks-librabft-a5503680b151



######論文翻訳: HotStuff: BFT Consensus in the Lens of Blockchain
>https://hazm.at/mox/distributed-system/algorithm/transaction/hotstuff/hotstuff-bft-consensus-in-the-lens-of-blockchain/index.html

######コンソーシアム型ブロックチェーンで使用できる合意形成アルゴリズム「PBFT」
>https://gaiax-blockchain.com/pbft

######フィナンシェ第2回社内ブロックチェーン勉強会 〜Libra編〜
>https://www.wantedly.com/companies/company_8586948/post_articles/176026

######Libra BFTコンセンサス・アルゴリズムの解説
>http://lifeforearth.com/?p=8477

[^1]: 「HotStuff」は、2018年にVMWareResarchによって提案された、コンソーシアム型のブロックチェーンに向けたアルゴリズム。バリデータが増えた場合においても、通信負荷が抑制されるような仕組みを持つ。
[^2]: 「コンソーシアム型」とは、組織で定めた特定ノードだけが参加できる形のブロックチェーン。ビットコインのように不特定多数のノードが参加可能なブロックチェーンは「パブリック型」という。「コンソーシアム型」を「許可型(permissioned)」、パブリック型を「非許可型(permissionless)」と呼ぶ場合もある。
[^3]: 「PBFT(Practical Byzantine Fault Tolerance)」とは、コンソーシアム型の代表的なコンセンサスアルゴリズムのひとつ。リーダと他のバリデータの多数決によってコンセンサスをはかる仕組みを持ち、LibraBTFやHotStuffに影響を与えている。
【gulp.js】Browsersyncのリロード1回しかされない

gulpを使ったBrowsersyncがなぜか1回しかリロードされなかった時の対処法。


はじめに、動かなかったソース。
恐れ多くも、スクーを参考に進めていたので、そのままです。。。

- [Gulp入門：第2回 Gulpでさまざまなタスクを行ってみよう（全3回）](http://schoo.jp/class/3571/room)

```JavaScript
var gulp = require("gulp");
var browserSync = require("browser-sync");

gulp.task("default", function() {
  browserSync.init({
    server: {
      baseDir: "./src"
    }
  });
  gulp.watch("src/**", function() {
    browserSync.reload()
  });
});
```

対処法は、done()をつけました。
functionの中にreturnがなければ、done();をつけてそのタスクを完了したとしなければエラーが出るそうです。
多分今回はタスクが完了した事になっていなかったのが原因だったのかな。と思います。
以下、参考にさせていただきました。

- [かもメモ：Gulp 4 gulp.seriesとgulp.parallel](https://chaika.hatenablog.com/entry/2018/06/04/090000)

```JavaScript
var gulp = require("gulp");
var browserSync = require("browser-sync");

gulp.task("default", function(done) { //doneをつけました。
  browserSync.init({
    server: {
      baseDir: "./src"
    }
  });
  gulp.watch("src/**", function(done) { //doneをつけました。
    browserSync.reload();
    done(); //追加
  });
});
```

これでリロード1回しかしない問題は解消できました！
Rails6 active-admin における、WebpackerでbundleされたJSの追加のベストプラクティス

# 開発環境
- Rails6.0.0
- ruby2.6.0
- webpacker4.0.7

# ActionText × Active-admin

Rails6によってActionTextが導入されましたが、この影響は非常に強いです。
なぜなら、actionTextはその使いやすさから、これまでのtext_areaを完全に代替するものであり、これからとても使われていくことが予想されるからです。

しかし問題となってくるのが、

**ActionTextはデフォルトでWebpackerを使わなければならない**

ということでしょう。

これまでのアプリケーションはasset pipelineを用いたものが多かったのですが、これからはWebPackerとの共存を余儀なくされるでしょう。

今回僕が実装しようとしたのは、Active-AdminにおいてActionTextを実装することでした。しかし、Asset pipelineとWebpackerのズレが発生したので、そこを修正しつつ実装しました。

#実装

## 実装手順

1. そもそもActive-AdminはどこでCSS,JSを読み込んでいるかを知る
2. WebpackerのJSを読み込ませる方法を知る
3. Active-AdmindeWebpackerでBundleしたJSを読み込ませる方法を知る

## 1. そもそもActive-AdminはどこでCSS,JSを読み込んでいるか

これは、config/initializers/active_admin.rbの、

```config/initializers/active_admin.rb
  # To load a stylesheet:
  # config.register_stylesheet 'hgoehoge.css'
  #
  # You can provide an options hash for more control, which is passed along to stylesheet_link_tag():
  # config.register_stylesheet 'my_print_stylesheet.css', media: :print
  #
  # To load a javascript file:
  # config.register_javascript 'hogehoge.js'
```

という部分です。
ここで、config.register_(stylesheet, javascript)によって、Css,Jsを読み込んでおります。

しかし、あくまでこれはActive-admin全体でのJSの読み込みなので、一部でしか使わないActionTextのJSのために全体でJSを読み込ませるのも問題だと思い、ここではJSは特に追加しませんでした。

ちなみに、ここを学んでいる時に、Active-Adminが自動生成するcss,jsが自分達のcss,Jsを汚染してるという記事をたくさん見かけたので、その対策もしました。

[詳しくはこちら](http://totutotu.hatenablog.com/entry/2015/10/13/ActiveAdmin%E3%81%AE%E3%82%A2%E3%82%BB%E3%83%83%E3%83%88%E3%81%8C%E5%BD%B1%E9%9F%BF%E3%81%97%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E5%88%87%E3%82%8A%E9%9B%A2%E3%81%99)

## 2. WebpackerのJSを読み込ませる方法

では、WebpackerのJSを読み込ませるにはどうすればよいのでしょうか？

簡単で、htmlファイルで、

```
<%= javascript_pack_tag 'application' %>
```

とするだけです。これで、app/javascript/pack上のapplication.jsというjsが読み込まれます。

## 3. Active-AdminでWebpackerでBundleしたJSを読み込ませる方法

では、Active-adminでそのようにjavascriptを読み込ませるにはどうすれば良いのか。

今回は、ActionTextのJSを読み込ませることが目的であり、actiontextを用いるformに対してのみjsが適応されれば良いので、

```admin/model_name.rb
ActiveAdmin.register ModelName do
  # ...その他設定を記入

  form partial: 'form' #この一行を追加
end
```

として、formを自分でカスタマイズする方法を用いました。この'form'というのは、app/views/admin/model_name/_form.html.erbと繋がっている(partialを用いていて_がついていることに注意。拡張子は何でも良し)ので、

app/views/admin/model_name/_form.html.erbを新規作成して、

```app/views/admin/model_name/_form.html.erb
<%= javascript_pack_tag 'application' %>
```

を追加しました。

しかし、更に悲しいことに、railsのwebpacker派rails-ujsを使い、active-adminではjquery_ujsを用いていたので、衝突が起きてしまっていたので、active-adminように、action-text用のjsのみをimportしたadmin.jsというものを作成して、


```app/views/admin/model_name/_form.html.erb
<%= javascript_pack_tag 'admin' %>
```

としました。

これで、正常にActiontextのJSが読み込まれて、active-admin内でJsをincludeすることに成功しました。

他にも、Active-AdminのComponentクラスにJSの読み込みをOverrideする方法も会ったのですが、今回は使い方が局所的だったので、Pageをカスタマイズするようにしました。
Excel VBAでOn Error Resume Nextのスコープを気にした方がいい話

# 概要
Excel VBAでOn Error Resume Nextのスコープを気にしなかったらミスしたのでメモです。
簡単に言うと、On Error Resume Nextを実行する関数があって、そいつが呼び出した関数でエラーがあった場合、呼び出した関数が途中までしか実行されないという話です。

# 通常のケース
On Error Resume Nextを実行すれば、エラーがあっても止まらずに続行します。

```vb
Sub Main()
    On Error Resume Next
    Debug.Print "Main Begin"
    Err.Raise 1, "エラー"     'エラーがあっても止まらず続行する
    Debug.Print "Main End"   '続行するので、ここも実行する
End Sub
```

```:実行結果
Main Begin
Main End
```

# 呼び出した関数が最後まで実行されないケース！！
On Error Resume Nextを実行した関数があって、そいつが呼び出した関数でエラーがあると、エラーで抜け出してしまい途中までしか実行されません。
下記の例だと"Child End"も出力して欲しいですが、出力されません。
<span style="color: red; ">実行されてないことに気づけないので非常に厄介です。

```vb
Sub Main()
    On Error Resume Next
    Debug.Print "Main Begin"
    Call Child
    Err.Raise 1, "エラー"
    Debug.Print "Main End"
End Sub

Sub Child()
    Debug.Print "  Child Begin"
    Err.Raise 1, "エラー"  'ここで関数を抜け出す
    Debug.Print "  Child End"  'ここは実行されない！
End Sub
```

```:実行結果
Main Begin
  Child Begin
Main End
```

# 呼び出した関数を最後まで実行するためには
呼び出し先の関数でもOn Error Resume Nextを実行すれば、エラーがあっても継続されます。

```vb
Sub Main()
    On Error Resume Next
    Debug.Print "Main Begin"
    Call Child
    Err.Raise 1, "エラー"
    Debug.Print "Main End"
End Sub

Sub Child()
    On Error Resume Next  'これを追加すれば"Child End"が出力される
    Debug.Print "  Child Begin"
    Err.Raise 1, "エラー"  'エラーがあっても抜け出さない
    Debug.Print "  Child End"  'ここまで実行される
End Sub
```

```:実行結果
Main Begin
  Child Begin
  Child End
Main End
```

# 呼び出し先だけでOn Error Resume Nextした場合
ちなみに、呼び出し先だけでOn Error Resume Nextした場合は、呼び出し元でエラーがあればそこで停止します。


```vb
Sub Main()
    Debug.Print "Main Begin"
    Call Child
    Err.Raise 1, "エラー"   'ここでポップアップが出て停止する
    Debug.Print "Main End"
End Sub

Sub Child()
    On Error Resume Next
    Debug.Print "  Child Begin"
    Err.Raise 1, "エラー"  'エラーがあっても抜け出さない
    Debug.Print "  Child End"  'ここまで実行される
End Sub
```

```:実行結果
Main Begin
  Child Begin
  Child End
　※ ここで「アプリケーション定義またはオブジェクト定義のエラーです」のポップアップが表示されて停止する。
```
自宅利用なら Ubuntu と型落ちのノートPCがめちゃくちゃ安くて十分な威力を発揮する

自宅のデスクトップPCがある部屋にはクーラーがありません。

そのため、リビングなどに持ち運んで快適に使える2番手のノートパソコンが欲しくなりました。

しかし、そんなに高価なものを揃えるのはなんだか本末転倒で、悩みました。

そこでふと、中古のノートパソコンで Linux を使えば安く済む という学生時代に何度もトライして苦労したことを思い出しました。

この経験は、プライベートのPCでも通ずるものがあるなと思いまして、ふと記事にしてみることにしました。

Ubuntuだ Linuxだと言っても、所詮はパソコンですからこんな感じでキレイなデスクトップで、マウスを使って操作できるので楽勝です。

![ubuntu-itsumonotakumidesktop-600x337.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182842/d47a6c0c-c509-8f35-fdad-57dc7c089c0c.png)

同じように安いノートパソコンが欲しい方の役に立てば幸いです。

## Ubuntuをホントに自宅利用するとどうよ？

こちらをご覧ください。

**[自宅利用なら 無料OS と型落ちのノートPCが安価で威力を発揮する](https://takulog.info/ubuntu-note-pc-use-easy/)**

結論として、**思いのほか違和感なく活用できる**ということをお伝えします。
KT0915をArduinoで制御　AM・SW編　DSPラジオ

#はじめに
* KT0915の続編。FMに続いて、中波、短波に挑戦。
* バーアンテナをつなげて、コードを一部変更すると、あっさりと受信できました。
* 中波と短波は同じコードでいけました。

#使用したもの（FM編＋バーアンテナ）
* KT0915(http://www.aitendo.com/product/7449)
* KT0915のデータシート。上記参照。
* Arduino Uno互換機(ELEGOO)
* バーアンテナ　PA-63R、AR-55GT、2V59M。 ストレート用、スーパー用のどちらでもいけました。聞き比べはしてません。

#配線
* Ping10 と Ping11 にバーアンテナをつなぎます。バーアンテナは両端のタップを使いましたが、どこでも良いような気がします。
* 配線図は割愛。

#コード作成のポイント
* FMの場合、FMTUNEビット（レジスタ03h）を操作しましたが、AM、SWの場合、03hの代わりにレジスタ17hを操作すればよい。
* 03hと同様に、周波数（1khzで計算）と一緒に、AMTUNEビット(17h.15)を1として書き込めばよい。

#動作コード
* 上記のポイントを考慮して作成した、特定の周波数を書き込むシンプルなコード。FM用のを流用したので、余計なレジスタ設定が混じっているかもしれません。
* 短波（SW）も同じコードで行けました。設定周波数を変更すれば受信できました。

```
#include <Wire.h>
const unsigned int AM[]=
{                     
0x02,0x0007, // 100kh, RLmute dis
0x03,0x0000, // FMtune0, 00Mhz
0x04,0xe080, // SoftMute dis, Mute dis
0x05,0x1800, // stereo, DE50
0x0f,0x881f, // standby0, vol 11111
0x16,0x8002, // AM, AMAFC en

//0x17,0x8252, // AMtune1, 594kh
//0x17,0x82b5, // AMtune1, 693kh
0x17,0x83ba, // AMtune1, 954kh
//0x17,0x846e, // AMtune1, 1134kh

//0x17,0x9cf2, // SW tune1, 7410kh

0xff,0xffff,
};

void setup() {
  // put your setup code here, to run once:
Wire.begin();
int i=0;
while (AM[i] !=0xff) {
Wire.beginTransmission(0x35); // slave address 0x35
Wire.write(AM[i]);      // Register i
Wire.write(highByte(AM[i+1]));      // Register i H
Wire.write(lowByte(AM[i+1]));      // Register i L
Wire.endTransmission();     //
i+=2;
delay(100);
}
}

void loop() {
  // put your main code here, to run repeatedly:
}

```

#おまけ
* AM放送はそこそこ感度は良いですが、音が割れているような気がしました。
* 短波放送は、受信はできました（バーアンテナ不要）。天井から垂らしたリード線をアンテナ（Ping11に接続）にしているのですが、感度はあまりよくありませんでした（中国国際放送）。電波状況なのか、受信環境が悪いのか、コードが悪いのかよくわかりません。
エラー: Unprotected Private Key File (保護されていないプライベートキーファイル)


EC2インスタンスにsshでログインしようとしたときに、

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
Permissions 0777 for '/Users/NAO/Downloads/web.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/Users/NAO/Downloads/web.pem": bad permissions
ec2-user@54.249.87.*: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
```

と表示された！


プライベートキーファイルはその他のすべてのユーザーの読み取りおよび書き込み操作から保護されている必要がある。
プライベートキーがユーザー以外によって読み取りまたは書き込みできる場合、SSH はキーを無視し、表示されるようだ。


上記の例では777の権限があり、安全性は非常に低いので、SSH はこのキーを無視します。
エラーを修正するには、chmodコマンドを実行し、変更してあげればOK!

```
$ chmod 600 Downloads/private.pem
```
AWS認定ソリューションアーキテクト・アソシエイトを1週間で合格できた必勝法

数ヶ月前のお話なんですが、AWSの管理コンソールに触ることなく、合格しました！

<p><strong>AWS認定ソリューションアーキテクト・アソシエイト</strong></p>

<p>AWS自体にそんなに興味もないといえば嘘になるけど、業務で触れたことも無ければ、今後触れることもない。完全に興味本位。</p>

<p>でも、取らなきゃいけない時ってありますよね？会社に言われるエンジニアも多そう。</p>

<p>そんな困ってるエンジニアの皆様こそ、この記事はご覧ください。</p>

<h2>AWS認定ソリューションアーキテクト・アソシエイトにどれくらいで受かるか？</h2>

<p>所要時間はこちら。</p>

<p><strong>14時間</strong></p>

<p>一日2時間で7日間、土日は4時間ずつやるなら5日間でもいけるかもしれません。</p>

<p>これは管理コンソールを一切触らない前提。</p>

<p>資格を取得した後になって、初めてコンソール触って EC2やRDSのインスタンスを立てたりしてみました。</p>

<p>そこで感じたのは、そんな悠長なことやってたら、もっともっと時間がかかる！間違いない！</p>

<p>試験に受かることを最優先にするなら<strong>管理コンソールを触る必要はない</strong>です。</p>

<p>これは実践した結果です。</p>

<p>ほら、それで取れましたよ。これ、合格証。</p>

![20181005105641-600x460.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182842/c538cfa0-f45a-277e-e82e-2778acb62b86.jpeg)

<p>なんで管理コンソール不要かというと、作業手順なんかはまったく出題されないし、AWSの管理コンソールはそんなにビジュアルに優れたものでもないですから。</p>

<p>あの試験の出し方なら、実践は不要！</p>

<p>もちろん触ってみて、感覚を掴むのは良いことです。業務で扱うなら、必要不可欠とさえ言えるでしょう。</p>

<p>ただ試験合格だけ目指すなら、最短の道ではないと感じました。</p>

<h2>AWS認定ソリューションアーキテクト・アソシエイト必勝法</h2>

興味のある方はこちらをごらんください。

**[AWS認定ソリューションアーキテクト・アソシエイトを1週間で合格した必勝法](https://takulog.info/how-to-get-aws-solution-architect-associate/)**

皆様のお役に立てば幸いです。
Python x OpenCVで透視補正

### Perspective Correction
昔のブログから出てきたので供養
透視補正：*Perspective Correction*　台形歪補正とも言う？
何に使えるかは微妙ですがしゅごい！と当時の私は興奮していました。
Photoshopで何ができるか知らないお子様だったのです。今もうっかり解約忘れという諸事情で契約中ですが全然使いこなせていません。
当時試したOCRの精度がいまいちだったので、歪み画像でもこれ使って補正掛けてからOCR通せばええんちゃう？レシート読めるんちゃう？とか思っていた気もしますがやってきた時代に殴り飛ばされました。

### 結果
#### Before
![image1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63732/358d83e4-b096-fb82-f75e-5e0fb7789cbb.jpeg)

#### 補正をかける部分確認
<img width="703" alt="スクリーンショット 2019-09-04 8.59.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63732/48b1aed1-4dd7-2577-bc3e-9151e25ee09a.png">

#### After
![image2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63732/fdeba839-f36a-227d-3e79-7a3b3ae70846.jpeg)

### HOW
#### 事前準備
```
pip install numpy
pip install opencv-python
pip install pytesseract
```

#### コード
手動で補正したい部分の座標を入力していますが、四角形検出で自動的にいちばん大きいものの座標を取ってくるようにするとまたいい感じに使い勝手があるのかもしれません。
参考にしたStackOverflowのコードをPythonで書いてみた感じです。

```perspective_correction.py
#! /usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import cv2
from PIL import Image
import pytesseract
import sys
import math

if __name__ == '__main__':

    ## 画像読み込み
    filename = 'traff3.jpg'
    img = cv2.imread(filename, cv2.IMREAD_COLOR)

    # 補正したい画像中の台形の四隅の座標
    # upper left
    Q1 = np.array([int(192), int(136)])
    # upper right
    Q2 = np.array([int(607), int(115)])
    # lower right
    Q3 = np.array([int(658), int(382)])
    # lower left
    Q4 = np.array([int(230), int(408)])

    ratio = 1.6
    # 補正後の長方形の高さと幅
    newRecHeihgt = int(math.sqrt((Q3[0]-Q2[0])*(Q3[0]-Q2[0]) + (Q3[1]-Q2[1])*(Q3[1]-Q2[1])))
    newRecWidth = int(ratio * newRecHeihgt)

    # 補正後の新しい四隅の座標
    R1 = Q1
    R2 = np.array([R1[0]+newRecWidth, R1[1]])
    R3 = np.array([R1[0]+newRecWidth, R1[1]+newRecHeihgt])
    R4 = np.array([R1[0], R1[1]+newRecHeihgt])

    # 補正後の長方形の形を赤線で表示
    rec = cv2.imread(filename, cv2.IMREAD_COLOR)
    cv2.rectangle(rec, (R1[0],R1[1]), (R3[0],R3[1]), (0, 0, 255), 3)
    cv2.imshow('rectangle', rec)
    cv2.waitKey()

    # それぞれの座標をnumpyのarrayへ
    src = np.array([Q1,Q2,Q3,Q4], np.float32)
    dst = np.array([R1,R2,R3,R4], np.float32)
    print(src)
    print(dst)

    # Perspective Correction
    # 透視変換の行列を求める
    transmtx = cv2.getPerspectiveTransform(src,dst)
    offsetSize = int(250)
    # 変換行列を用いて画像の透視変換
    warp = cv2.warpPerspective(img, transmtx, (newRecWidth+offsetSize, newRecHeihgt+offsetSize))

    # 変換後の画像表示
    cv2.imshow('warp', warp) 
    cv2.waitKey()

    # 画像を保存
    cv2.imwrite('warp.jpg', warp)

    cv2.waitKey(0)
    cv2.destroyAllWindows()   
```

#### thanks
[Automatic perspective correction OpenCV](https://stackoverflow.com/questions/22519545/automatic-perspective-correction-opencv)
[備忘録]PostgreSQLでデータベースに接続する際のパスワードを省略する方法

#環境
PostgreSQL 11.5

#概要
PostgreSQLでデータベースに接続する際のパスワードは省略できる。
WindowsとUnixで方法が異なるため、それぞれの方法を記述する。

#Windows
%APPDATA%\postgresql\配下に pgpass.conf というテキストファイルを作成する。
pgpass.conf 内の記述書式は以下の通り

```
hostname:port:database:username:password
```
次のように複数のデータベースをまとめて記述できる。

```
#hostname:port:database:username:password

localhost:5432:postgres:postgres:password
localhost:5432:sample_app_development:yakiniku:111111
localhost:5432:sample_app_test:yakiniku:111111
```
先頭に#がつくとその行はコメントになる。

#Unix
環境変数のPGPASSFILEで設定されているファイル(デフォルトは~/.pgpass)にWindows環境と同じ書式の内容を記述する。
以下のコマンドでファイルの権限を600に変更する。

```
chmod 0600 ~/.pgpass
```

#参考
[PostgreSQL 9.4.5文書　31.15. パスワードファイル](https://www.postgresql.jp/document/9.4/html/libpq-pgpass.html)
CVE-2019-3394/Confluence本地文件泄露漏洞

### 漏洞影响范围
6.1.0 <= version <6.6.16
6.7.0 <= version <6.13.7
6.14.0 <= version <6.15.8
### 触发条件
1.一个有效的登录账号
2.该账号具有在空间「添加页面」的权限
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/ab191e4e-e27c-1874-5a43-97638646b096.png)
### 复现步骤
- 0.下载安装受影响的Confluence，例如`6.3.1`
![Confluence 6.3.1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/f44395ca-ce40-3ec8-3986-3836648d212c.png)
URL 直链:https://product-downloads.atlassian.com/software/confluence/downloads/atlassian-confluence-6.3.1-x64.bin
- 1.创建一个空白页
![空白页](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/74a8e926-eaf5-26e1-9570-5c8bc8fbc5fa.png)
- 2.插入一张网络图片
![插入图片](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/6e7b68cb-e26b-a555-f5e2-2c778ad93f80.png)
![网络图片](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/b0cac93a-da10-19cc-1585-add4fbff6e8e.png)
插入url改为你需要查看的文件，例如`/packages/../web.xml`
- 3.点击发布，抓取报文
![发布](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/20e887a4-959c-e3ae-1266-c57fffdcf5b0.png)
- 4.删除多余url前缀,只留下`/packages/../web.xml`,并放开报文
![删除多余url](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/693d337f-3d4c-7951-e8ee-3734ad2b4bdf.png)
- 5.查看页面源码确认修改成功
![页面源码](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/20557d77-f4b9-02d3-86fa-2f73ff178e09.png)
- 6.导出word，并抓包查看
![导出word](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/b682fb03-a6ad-34c4-7169-2a2d5fa2e194.png)
![抓包查看](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/6bf29d62-6d5b-d6f6-a90d-28a29765aacb.png)

### 路径说明
由于`catalina.jar`中的`org.apache.catalina.webresources.StandardRoot.class`的`getResource`方法的`validate`存在过滤和限制，所以可遍历路径均在`/WEB-INF`下

![validate](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/9b173544-d2e2-9927-30a5-4a85c4d8c182.png)

可读取的文件大致如下

```
#WEB-INF下
decorators.xml
glue-config.xml
server-config.wsdd
sitemesh.xml
urlrewrite.xml
web.xml
#/WEB-INF/classes下
confluence-filtered-frames.properties
confluence-init.properties
crowd.properties(较为重要)
hash-registry.properties
lgplTemplate.soy
log4j-diagnostic.properties
log4j.properties
logging.properties
mime.types
osuser.xml
seraph-config.xml
seraph-paths.xml
velocity_implicit.vm
velocity.properties
```
### 修复方法
升级到最新版本即可
### Reference
https://paper.seebug.org/1025/
Node.js関連の参考URL

個人用のメモです。
僕が初学者なので、初学者の人が読んでわかるリンクを載せています。
日々更新します。
世の中に発信してくれている人達のおかげで僕もコツコツ作品作れます。
ありがとうございます。

- *MacにNode.jsをインストール*

[https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09](https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09)

- *Node.jsでserver.listenするlocalhostのIPアドレス*

[http://arisua4.hatenablog.com/entry/2015/05/11/234251](http://arisua4.hatenablog.com/entry/2015/05/11/234251)
127.0.0.1にすればいいやつ。

- *node-postgres公式ドキュメント*

[https://node-postgres.com/features/connecting](https://node-postgres.com/features/connecting)

- *node-postgresへのアクセスの仕方*

[https://symfoware.blog.fc2.com/blog-entry-2114.html](https://symfoware.blog.fc2.com/blog-entry-2114.html)

- *勉強メモ/npmの使い方*

[https://qiita.com/msakamoto_sf/items/a1ae46979a42d6948ebd](https://qiita.com/msakamoto_sf/items/a1ae46979a42d6948ebd)

- *テンプレートエンジンEJSで使える便利な構文まとめ*

[https://qiita.com/y_hokkey/items/31f1daa6cecb5f4ea4c9](https://qiita.com/y_hokkey/items/31f1daa6cecb5f4ea4c9)

- *[Express] Expressの開発環境構築～デバッグ環境構築*

[https://qiita.com/ksh-fthr/items/c22dedbc0952bfdcc808](https://qiita.com/ksh-fthr/items/c22dedbc0952bfdcc808)
ポート番号変更したい時に参考にしました。

- *日付の扱い*

[https://techacademy.jp/magazine/16245](https://techacademy.jp/magazine/16245)

- *dateutilsを日本時間にしたい*

[https://confrage.jp/ecma-script6%EF%BC%88javascript%EF%BC%89%E3%81%AEnew-date%E3%82%92utc%E3%81%8B%E3%82%89jst%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/](https://confrage.jp/ecma-script6%EF%BC%88javascript%EF%BC%89%E3%81%AEnew-date%E3%82%92utc%E3%81%8B%E3%82%89jst%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)

- *ログを出力したい*

[https://github.com/log4js-node/log4js-node/blob/master/README.md](https://github.com/log4js-node/log4js-node/blob/master/README.md)
本家です。

[https://www.sejuku.net/blog/82816](https://www.sejuku.net/blog/82816)
もうちょい噛み砕いているもの。

- *バッファ（バイナリ）を文字列にする*

[http://info-i.net/buffer-string#i-3](http://info-i.net/buffer-string#i-3)
PythonでExcelの区切り文字を痴〇（置換）した話

#本題
###~~へへへ、すけべなセルしてるじゃねえか~~
はい、題名の通りExcelファイルの中身を置換してCSVで保存する作業をpythonで自動化（？）した話です。

#やりたいこと
Excelの特定の範囲から該当の個所を置換⇒CSVにして保存させたい。
今まではExcelの範囲を指定⇒サクラエディタに貼り付け⇒置換を3回⇒CSVとして保存してました。
なぜサクラエディタに貼り付けているのか？
一度手でやっていた作業を見てみましょう。

まず以下のようなExcelがあります。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362091/aea57b1c-a43d-63f8-e187-0e5aab9f0dd8.png)

はいここでF〇〇Kポイント1つ目、使用する場所はB列～E列、3行目から最終行（可変）です。
####~~おいおい、なんだこのスケベな空欄とスケベな範囲は~~

範囲が変動（列は固定）なのはまあいいとして、これ空欄セルがあると読み込んだ時になぜかNoneで入ってくる時があるんですよね。そのせいで処理が少しめんどくなります。（後ほど説明）

じゃあ範囲を選択してコピー⇒サクラエディタに貼り付け、そして3回置換します。
1回目
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362091/651ee80a-6e44-b603-9d66-58bd50945f13.png)
2回目
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362091/a33717c8-ddc2-ada0-5d70-090c9a60a587.png)
3回目
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362091/40c7eff4-60d7-a9f8-998c-69f8d99bb710.png)
完成したもの
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362091/5f741981-17f5-78bf-19ed-3e6f036e5f02.png)

はい、もうおわかりでしょうか。
そうです。（題に書いてる）
#####セルの文字ではなく区切り文字を置換しています。
####~~おいおい、なんだこのスケry~~

#やったこと
「python excel 置換」で検索すると文字を置換するのは普通に出てくるんですけど区切り文字置換がなかなか見つからないので苦戦しましたねぇ。
使うのはPythonの`openpyxl`というパッケージです。
そもそもこれには区切り文字を指定することのできる`delimiter`というものがあるのですが、`delimiter`で指定できるのは1文字のみという制限があります。今回の場合は区切り文字を`","`という3文字にしたいのでこれは使えませんでした。（使えないわけではないですが結局簡単にはいかない）
じゃあどうしたか、プログラムは以下です。

```Python:csv_ex.py
import openpyxl
#--------------------- excelファイル変換処理----------------------------
xlsx_file = r"C:\Users\user\Desktop\import\test.xlsx"
csv_file = "TEST.csv"
# エクセルブック
wb = openpyxl.load_workbook(xlsx_file, data_only=True)
# エクセルシート
ws = wb["Sheet1"]

for row in ws.iter_rows(min_row=3,min_col=2,max_col=5,values_only=True):
    row = list(row)
    row = ["" if x is None else x  for x in row]
    row = "\"" + "\",\"".join(map(str,row)) +"\"\r\n"
    with open(csv_file,"a",newline="") as f:
        f.write(row)
```

主な部分としては10行目以降ですね。
まず

```Python:csv_ex.py
for row in ws.iter_rows(min_row=3,min_col=2,max_col=5,values_only=True):
```
ここで読み込む範囲を指定します。rowに関してはスタート地点`min_row`を指定、`max_row`を記載しないことで記載があるところ（最終行）まで特定します。
列に関しては固定なので`min_col`,`max_col`を指定します。
最後の`values_only=True`でセルの値を取ってくるよう指定します。
11行目で、値はtuple型で帰ってきますが処理しやすいようリスト型に変換します。
12行目

```Python:csv_ex.py
row = ["" if x is None else x  for x in row]
```
前半で言いましたが空欄を読み込んだ時に時々`None`で返される時がありました。そのままCSVで保存するとセルに`None`が入るのでここで`None`を空欄に変換してます。
13行目

```Python:csv_ex.py
row = "\"" + "\",\"".join(map(str,row)) +"\"\r\n"
```
はい
まず無理やり行の前後に`"`をつけてます。
そして`"\",\"".join(map(str,row))`ここでリストとして取得した1行の各値を`","`を間に挟んで文字列とします。
例えば4行目だったら`[S2346,Y,234,MT]`というリストを取得して`S2346","Y","234","MT`という文字列を得る感じですね。
そして最後にCSVファイルに書き込んでいく、という処理を今回は作りました。
#最後に
もうちょっときれいに作れたらよかったんですけど3文字の文字列ということで今回はこのような力業プログラムを作成しました。まあ実業務で作った奴はもうちょっと複雑なのですが、Excel変換につかれたエンジニアの手助けになればいいなと思います。
またQiitaの使い方になれていたいのですが、ここで作成したのはあくまで一例です。
これが正解ではないですし、もっといい方法があれば教えていただきたいです。
不要マージコミットを消し去ってプッシュし直したい



先日不要なmerge commitを含んだブランチをリモートにプッシュしたらあわわわになったので残します。
誤った理解で実行していたものがあったのが原因なので後輩を生まないために記します。

# 背景
1. ローカル feature/で作業していた
3. 誤って作業ブランチにプルった（ブランチ違いに気付いてない
4. merge commitに気付かず作業ブランチをリモートプッシュ
5. やばい要らんコミットめっちゃある😇

# やりたいこと
- merge commit をないことにして、上がってしまった不要なコミットを消したい

# やったこと

まず調べたら出てくる`[マージコミット　取り消す]`とかで出てくる`revert`を実行。


##１. revertで該当マージコミットを打ち消す

```
git revert -m 1 <merge commit>
```
マージコミットに対して`revert`を使用する場合は`--mainline (-m)`のオプションが必要。
ちなみにこの数字は、マージコミットを消し去った場合に、マージされた側（１）、マージした側（２）どちらを軸にするかという事。

##2. 差分が消えたのでプッシュしたらコミットだけ残っている

<img width="７００" alt="Screen Shot 2019-08-31 at 11.14.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274090/8797ea78-4d7f-97c1-ad4c-ffd51b2bc211.png">

ここで先輩エンジニアが、こいつをこのまま独走させる何かヤバイと感じ取ってくれたのか以下の解決策を提案してくれた。

# 解決策

## rebaseでコミットを削除して整える

```
git rebase -i -p <消したいコミットの一個前>
```

を使用して不要なコミットを削除。
この場合、以下の２行を削除。

```
pick 25c2372 Merge........... ← 間違ったマージコミット削除
pick 9770416 first...........
pick 9999999 Revert.......... ← 失敗したリバート削除
```

プッシュすると不要コミットがなくなって理想の形に。

### rebase オプション詳細

|略&nbsp;|正式|用途|
|:---:|:---|:---|
|-i|--interactive|文字通り対話的に操作でき、コミットの削除や複数をまとめたりといった操作が可能|
|-p|--preserve--merges|ブランチの構成を保ったままリベースされる<br>参考：　https://qiita.com/yukimaeto/items/983a4e27dbc92e6aa6fb|

※--preserve--mergesは git version 2.20よりdeprecatedになります。代替えとして--rebase--mergesが用意されています。

# まとめ
結局`rebase -i`が使い勝手よくて良い。
だがなぜ`revert`したのにコミットがたくさん残っていたのかわからない。メインラインが
逆だったのだろうか。
さくらレンタルサーバーにgitでアップロードしてみた

#前提
Githubにリポジトリがあって中身が入っている。（１コミット以上ある）
terminalは操作できる
gitを使わなければアップロードしてサーバーで稼動できる。
#Git対象にしたいフォルダを空にする
まず、サーバー側のGit管理対象にしたいフォルダを空にします。
一つでも残っているとcloneできないみたいです。
先に消すようにエラーが出ました。
#Githubからクローンする
Githubにログインして自分のアプリのページにいき、下の [Clone or download]ボタンをおす。
<img width="1032" alt="スクリーンショット 2019-09-02 23.33.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201982/00e04285-a19e-488a-0e2c-cbcc447bf20b.png">
そうするとクローンのためのアドレスがコピーできるので

sshでサーバーにログインしてwww以下のさっき空にしたか新しく作ったフォルダにcdで移動して

```terminal
git clone https://[さっきGithubでコピーしたアドレスを貼り付ける]
```

---
(2019/11/14追記)
セキュリティを気にしないならwwwディレクトリの中でやると簡単です。
私も今はそうです。
ただし本来は他のディレクトリに作って、publicフォルダだけシンボリックリンクでwwwから見れるようにするのが手順らしいので、自分用でなく、業務案件ではそうしてください。業務なら普通手順書があるとは思いますが。

---
この時点でブラウザでアクセスしてみると500エラーになる、404でなければ進んでいるはずなのでまだ焦らない。
~~まず、プロジェクト内のvendorフォルダがコピーされていないので、これをFTPソフトかscpコマンドかで手動でサーバーにアップロードする。（非常にサイズが大きく時間がかかる）
このフォルダはgit_ignonreに設定されているのでpushしても無視されているそうです。~~

venorフォルダを.git_ignoreに設定されているので該当箇所の前に!マークをつけて打ち消してからコミットするとpushできます。というか先にそうしておけば一回で済みそう。

あと、
envファイルの設定が必要なので以下のページをみて作る。
https://laraweb.net/environment/3192/
作れたら 

```
php artisan key:generate
```

---
(2019/11/14 追記) 
composerでLaravelを生成した場合、自動でAppkeyが入っているので、そのenv.を使用する場合は必要ないとの事です。空のサンプルからコピーした時は上記手順が必要。

---
DBを使っていないページだとこの時点で表示できると思います。多分。
筆者はMySQLを使っていたのでここでDBエラー。
このへんの対応は私の前回のページに書いているのでコケた人は下もみてみてください。
https://qiita.com/misskabu/items/e120098a8bc2a8aedadc

#GithubからサーバーにPullする
本当は直接ローカルからgithubと一緒にさくらサーバーにもpushしたかったのですが、
さっきさくらサーバーにクローンしたgitアドレスがわからなかったため設定できませんでした。

私と同じようにわからない人はgithubからpullすれば一応使えます。
この場合sshでさくらサーバー側のgitディレクトリへ行って（というか初めからターミナル開けたままだと思うので普通今そこにいると思いますが）

```
git pull [さっきGithubでコピーしたアドレスをまた貼り付ける]
```

ユーザー名とパスワードを聞かれますが、これはgithubのログインパスワードを入力します。
これで更新した差分が取れました。

#今回できなかったままのこと。
自動でpullできるようにしたかったのですが、その場合さくら側のgitのフルパスを入れる必要があります。
それさえわかればwebhookというので自動化できるようです。
githubのパスワードも省略できそう。

以下のベージ参照。
https://qiita.com/prex-uchida/items/f8bc05eb91b944b6214e

[追記]
下のアドレスでヒントになりそうなことを書いているひとがいました。まだ試していませんが、やってみようかと思います。
https://michimani.net/post/sakura-create-git-repo/
Houdiniで簡単なPythonのツールをつくる

#はじめに
Houdiniを勉強するにあたり、自分の得意分野であるリギングから進めようと考え、チュートリアルを始めました。[リンク](https://www.sidefx.com/ja/learn/collections/rigging-series/)

チュートリアルを進める上で気になったのが、ノードとノードの位置合わせ方法です。

    1. 指定位置にあるノードの子として位置を合わせたいノードを接続
    2. 位置を合わせたいノードの移動値を0にする
    3. 【keep Position When Parenting】 にチェックを入れる
    4. 接続を切断する
ノードを位置合わせするたびに、上記の手順を繰り返しています。
こんなのやってられないので、ツールを作ってみました。

#位置合わせツール
指定位置にあるノードと位置を合わせたいノードを選択し、下記のコードを実行すると、位置合わせができます。

```python
Nodes = hou.selectedNodes()

if len(Nodes) >= 2:
    Target_Node = Nodes[0]
    Source_Nodes = Nodes[1:]
    
    xform = Target_Node.worldTransform()
    
    posx = xform.at(3,0)
    posy = xform.at(3,1)
    posz = xform.at(3,2)
    
    for Source_Node in Source_Nodes:
        Source_xform = Source_Node.worldTransform()        
        Source_xform.setAt(3,0,posx)
        Source_xform.setAt(3,1,posy)
        Source_xform.setAt(3,2,posz)
        
        Source_Node.setWorldTransform(Source_xform)
else:
    print("ノードが選択されていません。:")

```

##コード解説
```python
Nodes = hou.selectedNodes()
```
選択されたノードを取得しています。

```python
    xform = Target_Node.worldTransform()
    posx = xform.at(3,0)
    posy = xform.at(3,1)
    posz = xform.at(3,2)
```
ノードのワールドのトランスフォームを取得します。座標行列から移動値を抜き出します。

```python
    for Source_Node in Source_Nodes:
        Source_xform = Source_Node.worldTransform()        
        Source_xform.setAt(3,0,posx)
        Source_xform.setAt(3,1,posy)
        Source_xform.setAt(3,2,posz)
```
位置合わせしたいノードのワールド座標を取得し、上記で抜き出した移動値を位置行列にセットします。

```python
    Source_Node.setWorldTransform(Source_xform)
```
最後に、位置合わせしたいノードのワールド座標を更新します。
yarnが原因でdocker-compose runが実行できないときの対処法

`docker-compose run`コマンドを実行すると、以下のエラーが出るようになった。

```
warning Integrity check: System parameters don't match                                                                                                                                                 
error Integrity check failed                                                                                                                                                                           
error Found 1 errors.                                                                                                                                                                                  


========================================
  Your Yarn packages are out of date!
  Please run `yarn install --check-files` to update.
========================================


To disable this check, please change `check_yarn_integrity`
to `false` in your webpacker config file (config/webpacker.yml).


yarn check v1.17.3
info Visit https://yarnpkg.com/en/docs/cli/check for documentation about this command.
```

## 原因
調べてみると、**`yarn`のパッケージの中に古いものが存在していること**が原因のようでした。
なので、以下のコマンドを実行して yarn をアップグレードしてみる。

```
$ yarn upgrade
```

しかし、また同じようなエラーログが出て`docker-compose run`が実行できない。

## 解決方法
最終的に、エラーのログに出ている以下の方法を試しました。

```
To disable this check, please change `check_yarn_integrity`
to `false` in your webpacker config file (config/webpacker.yml).
```

要は、「config/webpacker.yml」ファイルの`check_yarn_integrity`箇所を`false`に変更すれば良いと解釈して、実際に変更してみる。

```yaml:config/webpacker.yml
# Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules
check_yarn_integrity: false
```

すると、エラーは出なくなり`docker-compose run`は実行されるようになりました。