OmniAICreator/Qiita-1.07M huggingface dataset:
Node.jsとDenoをそれぞれ検出する方法 with globalThis

UniversalなJavaScript/TypeScriptを書くなら、Node.jsとDenoそれぞれ双方で動くコードを書きたいものです。

おそらく時間はかかるけど、確実な方法は、`Deno`モジュールをNode.jsに移植するという力業でしょう。Node.jsやオンブラウザで動く`Deno`互換モジュールさえあれば解決しそうです。

ただ、それはさておいて、まずはNode.jsとDenoをそれぞれ判別するところから初めてみます。

```ts
if ("Deno" in globalThis) {
  console.log("Deno", globalThis.Deno.version.deno);
  globalThis.Deno.exit(0);
}

if ("process" in globalThis) {
  console.log("Node", globalThis.process.versions.node);
  globalThis.process.exit(0);
}

console.log("unknown environments");
```

このコードをDenoで動かすと

```
$ deno hoge.ts
Deno 0.21.0
```

のように、`Deno 0.21.0`というバージョン情報を取得できます。

```
$ node hoge.ts
Node 12.6.0
```

Node.jsの方ではTypeScriptではなくJavaScriptとして実行してますが気にしないでください。

ひとまず、`globalThis`といういささか気持ち悪いグローバルオブジェクトに、`Deno`が定義されていればDeno環境で、`process`が定義されていればNode.jsだと判定して良いと思います。

本当は`globalThis.process.versions.node`まで見た方が確実ではあります。

判別したあとは、型定義があれば`Deno.version`や`process.versions`のように、直接それぞれのグローバルオブジェクトを触っても安全ですが、TypeScriptで、`@types/node`と`deno.d.ts`を共存させるのは面倒なので、ここでは`globalThis`経由で触っています。
Mac,Windows,Linux(Raspberry pi)で共通のファイルシステムでファイルをやりとりする(NTFS)

# なぜやるのか

Mac,Windows,Linux(Raspberry pi)で共通マウントできる記録デバイスが欲しい。

# これまでにやったこと

最初はMac-Raspberry pi（以降ラズパイ）間でやりとりできれば良いということでMacにfuse-xfsとか入れましたが、うまくフォーマットできず断念。
ラズパイ側でxfsフォーマットしてもなぜかMac側でマウントできなかった。
Mac側ではフォーマットができなかった。。。

# やったこと

ラズパイにUSBでHDDをつないで

```bash
root@raspberrypi:~# parted /dev/sda
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt                                                      
(parted) mkpart                                                           
Partition name?  []? primary                                              
File system type?  [ext2]? ntfs                                           
Start? 0                                                                  
End? -0                                                                   
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? Ignore                                                     
(parted) p                                                                
Model: Jmicron Corp. (scsi)
Disk /dev/sda: 500GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size   File system  Name     Flags
 1      17.4kB  500GB  500GB  ntfs         primary

(parted) q

root@raspberrypi:~# mkfs.ntfs -f /dev/sda1
```

でNTFS作成

Mac側ではntfs-3gをインスコして

```bash
sudo su -
ntfs-3g /dev/disk2s1 /mnt/ -olocal -oallow_other
```

/mntにread/writeでマウントできました。
Macでsudo cp hogehoge /mnt/とファイルコピーした際に

```bash
~ Operation not supported on socket
```
とか出たけど書き込んだファイルの中身をラズパイ側で確認＆書き込み出来たので気にしない。
※Winで読み書きできるかはまだ未検証（2019/10/20現在）
【#PowerApps Tip's】ドロップダウンを未選択に戻す方法

PowerApps の「ドロップダウン」コントロールが初期化、というか未選択(ブランク)状態に戻せる設定ができるようになりました。

# ドロップダウンとコンボボックスについて
PowerApps には似たような機能が２つあります。よくわからない、という方は、当方が以前にまとめた下記の記事をご確認ください。

[[PowerApps Tip's]そっくりさん？ドロップダウンとコンボボックスのちがい](https://qiita.com/yamad365/items/3c6c5faba79d3821ad20)

上記の記事投稿時、ドロップダウンコントロールは未選択（ブランク）にすることができませんでした。それがVerUpによって未選択状態を設定できるようになったようですよ！

# 実際の動作
下記の動画をご確認ください。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr"><a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> DropDown [AllowEmptySelection]property <a href="https://t.co/2KdapnTNsG">pic.twitter.com/2KdapnTNsG</a></p>&mdash; やま (@yamad365) <a href="https://twitter.com/yamad365/status/1185461269710589952?ref_src=twsrc%5Etfw">October 19, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 未選択状態を設定する方法
[AllowEmptySelection]プロパティを true に設定するだけです。
既に、動画を提示しちゃってるのでネタバレしまくりですねｗ

[PowerApps のドロップ ダウン コントロール](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/controls/control-drop-down)

# 未選択状態にする際の注意
動画を見て気づいた方もいるかと思いますが、リストの選択肢に空白行（ブランク）が増えるワケではありません。未選択状態に戻すには”現在選択されている値を、再度クリックする”必要があります。
正直、このオペレーションは初見では全く気づけないと思います。なので、画面上にメッセージを置くか、アプリのデモ動画などで周知するなどのフォローが若干必要かなぁ、と思いました。

# [Reset]プロパティと組み合わせてみる
PowerApps の各種コントロールを初期値に戻す、［Reset］プロパティと組み合わせてみましょう。こちらも動画をご覧ください。

## Resetプロパティ組み合わせ動画
<blockquote class="twitter-tweet"><p lang="en" dir="ltr"><a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> DropDown [AllowEmptySelection]property + [Reset]Action <a href="https://t.co/BnOUHzbfpe">pic.twitter.com/BnOUHzbfpe</a></p>&mdash; やま (@yamad365) <a href="https://twitter.com/yamad365/status/1185793863505498115?ref_src=twsrc%5Etfw">October 20, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 解説
Reset（＝初期値に戻す）処理が実施される ＝ [Reset]プロパティ = true になった場合、コントロールの値は[Default]プロパティで指定された値になります。まず、初期値をブランク（Blank()）に設定します。

``` Dropdown.Default
Blank()
```

また、Reset処理は変数を経由して、
　true ＝ リセット処理される
　false ＝ リセット処理されない
という状況を作り出す必要があります。
動画では、アイコンクリック時に変数を true にして、ドロップダウンコントロールのOnChangeで、その変数を false にしています。

ここで [AllowEmptySelection]プロパティの true／false によって動作に違いが発生します。

[AllowEmptySelection]＝true → Reset で Blank()（空白）になります。
[AllowEmptySelection]＝false → Reset で 1 （厳密には先頭のアイテム）になります。

# まとめ
- ドロップダウンコントロールで未選択状態を指定できるようになった
- [AllowEmptySelection]で指定する（true で発動）
- 未選択状態（ブランク）にするためには、現在選択中のアイテムを再選択する必要がある
- Reset と組み合わせる場合は、前述プロパティの true/false で動作が異なるので注意

過去、この[AllowEmptySelection]プロパティが存在しなかった時は、コンボボックスを選択するか、コレクションの先頭に空白のデータを追加したうえでデータソースの値をForAllで詰め込みなおす等のテクニックを使う必要がありました。このプロパティが追加されたことで、ドロップダウンコントロールの利用頻度があがるのかな、と思った次第。ナイスアップデートですね！

なお、このプロパティは、当方が所属するチームの優秀なメンバーが見つけてくれました。感謝！

それでは、皆さま。素晴らしい Power Platform Life を！
一瞬でElm x Parcel (CSS in JS)な開発環境を作れるレポジトリを作った

個人開発だとwebpackよりparcelを使ってelmアプリを作ることが多い

これまでは先人の書いてくだすった手順をもとにシコシコ作っていたのだけれど複数ページに情報がまたがっていたりしてめんどくさいのでレポジトリを作った

npmとgitさえ入っていれば一瞬で開発環境作れるのでEllie使うんでなく実際の挙動を確かめたい、というときにサクッと作ってサクッと消すなど用途は色々使えそうだと思う

[lilpacy / elm-parcel-min | Github](https://github.com/lilpacy/elm-parcel-min)

以下、セットアップ方法(READMEに記載のものと同じ

```shell
$ git clone git@github.com:lilpacy/elm-parcel-min.git
$ cd elm-parcel-min
$ sh setup.sh
```

終わったら以下のコマンドでwatchモードでのビルド&devサーバーの起動ができる

```shell
$ sh dev-server.sh
# -> Server running at http://localhost:1234
# ✨  Built in XXms.
```

`http://localhost:1234`にアクセスで以下のような単純なアプリが表示されるはず

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170241/1acffc32-e5ce-ee40-28f9-51b9663fed52.gif" style="max-height:450px;"/>

CSS-in-Javascriptな作りであるのでPCとスマホでCSSを出し分けるとかも簡単にできるし、JSだけじゃなくCSSのホットリロードにも対応している（ファイルを変更して保存すると画面を自動でリフレッシュしてくれる

本番運用としてはFirebase Hostingがとても便利なのでまたの機会にまとめたいと思う

以上。

#### 参考

1: [関東最速でElm+JSなアプリの開発環境を作る](https://qiita.com/IzumiSy/items/4aff1db5c773c48ef50b)
2: [Parcel でまとめる Elm と css と js のススメ
](https://qiita.com/kyasu1/items/44e67b8755f1adcfef67)
raspberry piでpdfいじり

#余ってたラズパイゼロでpdfのページ逆転
普通にインストールしたら逆転してみます。
今回は全頁を逆転。
ファイル名：TestData.pdf
出力ファイル名：Adata.pdf

```
sudo apt-get install pdftk
pdftk Testdata.pdf cat end-1 output Adata.pdf
```

#ついでに結合

```
pdftk data1.pdf data2.pdf data3.pdf cat output marge.pdf
```
ARKit, SceneKit個人的まとめ - 基礎編

# シーンとノード


# boundingBox, boundingSphere
#### boundingBox
図形や立体を最小で囲む図形の箱(`Storyboard`のTransformsでも見れる)

```swift
let (min, max) = hogeNode.boundingBox
//hogeNodeの幅を計算
let width = CGFloat(max.x - min.x)
//元の大きさ(boundingBox)の1/10にスケールする
let magnification = 0.1 * 1 / w
hogeNode.scale = SCNVector3(magnification, magnification, magnification)
```
#### boundingSphere
図形が変わっただけで考え方は同じ

->minが左下座標, maxが右上座標
**・[boundingBox - SCNBoundingVolume | Apple Developer Documentation](https://developer.apple.com/documentation/scenekit/scnboundingvolume/2034705-boundingbox)**
->centerが中心座標, radiusが(対象がギリギリで全部おさまる)半径
**・[boundingSphere - SCNBoundingVolume | Apple Developer Documentation](https://developer.apple.com/documentation/scenekit/scnboundingvolume/2034707-boundingsphere)**

# アニメーション
アニメーションはcoreAnimatonなど色々あるが
sceneKitでは`SCNAction`を使うのが一般的らしい
確かにシンプルで使いやすい感じ。

# 他参考
**・[iOS で SceneKit を試す(Swift 3) その16 - Scene Editor の Node Inspector - Apple Engine](http://appleengine.hatenablog.com/entry/2017/07/06/155203)**
->シリーズ90まであるので大変だけどこれ一通りやってしまえばSceneKitは攻略したもんだと思う、、、気がする
Batabase基礎メモ

メモ

エンティティ > エンティティの定義
・<キー>を何にするか、どのような属性(列)を持たせるか
・主キー<PK>、外部キー<FK>(参照生合成制約)
・親が存在しなければ子は存在できない(親:子=1:多)
→子に対して複数の親を存在していないか(ポリモーフィックというアンチパターン)
・正規化: テーブルを分解し、データの冗長性をなくす。
	{X} -> {Y} :YはXに従属する => XによってYが一意に定まること
	主キーに対して全ての属性が従属である
・テーブル内部に存在する段階的な従属関係を推移的関数従属
	e.g., {社員ID} -> {部署ID}は従属であり、{部署ID} -> {部署名}も従属である。
		∴ {社員ID} -> {部署ID} -> {部署名}
	
・✖️マルチカラムアトリビュート(要素を追加したい時にカラムを増やさないといけない設計)
・✖️1:1の関係、多:多の関係 => 中間テーブルを作成
・リソース系エンティティ(モノ) or イベント系エンティティ(できごと)
エンティティの候補
・6W1H
リソース系
	- Whom: 誰に（顧客・仕入先など）
	- Who: 誰が（従業員・役職・組織など）
	- What: 何を（商品・勘定科目など）
	- Where: どこ（販売ルート・地域・支店や営業所など）
イベント系
	- How: どのように（販売・仕入・出荷・入金など）
属性の候補
	- When: いつ
	- When: どれぐらい（量）
	- How much: いくら（金額）
いわゆるビジネス上の正規化の対象となってくるもの
	- Why: なぜ（売上・返品・値引き・補充など)
初心者のためのGo言語基礎〜Goの特徴とインストール〜

# 初心者のためのGo言語基礎〜Goの特徴とインストール〜
![125ce0baff3271761ca61843eccf7985.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265038/c0caa6c8-c14d-00d8-d757-33877d21be28.jpeg)


最近Goを学習し始めたので、基礎から少しずつ学んだことをアウトプットしていきます。

システムレイヤーも含めて学んでいるので、基本的な文法から低レイヤーの仕組みまで少しずつまとめていきたいです。

## 1. Go言語とは
GoはGoogleによって開発されたプログラミング言語です。
GolangやGo言語とも呼ばれます。
2009年に発表され、最近ではWebサービスのサーバサイド開発に多く使われるようになりました。

### 人気急上昇中で年収も高い
株式会社ビズリーチが発表した「**プログラミング言語別年収ランキング2018**」では <font color="red">**第1位**</font> となっており、需要が高く年収が高い傾向にあるようです。

#### 様々な開発に使われている
すでにGoは様々なソフトウェア開発で使われています。
あのDockerもGoで書かれていたり、身近なサービスだとメルカリやグノシーでも使われているようです。

## 2. Go言語の特徴
### 2.1. 言語仕様がシンプル
言語仕様がシンプルなため、初心者でも習得しやすい言語と言われています。

C言語の性能と、Pythonの書きやすさを併せ持った言語として開発された背景があります。
機能をシンプルにすることによって、予期せぬミスを防いだり高いパフォーマンスを実現しています。

例えば以下の特徴があります。
- 繰り返し構文はfor文のみ（whileは無い）
- if文の{}は省略できない
- if文の三項演算子は使えない
- ジェネリクスがない
- 継承がない
- 例外処理がない




### 2.2. パフォーマンスが高い
C言語の性能を目指して作られただけあり、非常に動作が高速です。

- コンパイルが速い
- 実行速度が速い
- 消費リソースが少ない
- 拡張性が高い
- 並列処理が得意

### 2.3. 大規模開発にも向いている

- 静的型付け言語である
- コーディング規約が定められている
    - `go fmt`という標準コマンドにより、統一的にフォーマットされる
    - 誰が書いても読みやすい記述になる


## 3. Go言語をインストールする
※macOSを前提

以下の公式サイトからダウンロードし、インストールしてください。
https://golang.org/dl/

以下のコマンドを入力し、バージョン番号が表示されればインストール成功です。

```terminal
go version
```

## 4. Go言語でHello World!
新しい言語を学習する時はまずはコレですね。

```go:hello.go
package main

import "fmt"

func main() {
   fmt.Println("Hello World!")
}
```

実行します。へろーわーるど

```bash
$ go run hello.go
Hello Wolrd!
```

## 5. Goの基本構文を学習したい
[A Tour of Go](https://go-tour-jp.appspot.com/welcome/1)でサラッと基本を学びましょう。
〜ダレワカ〜Ruby on Railsの基本、基礎的な仕組みが分からない！(ルーティング、コントローラー、ビュー編)

#？？　Ruby on Railsの基本的な仕組みってどうなってるの　？？

## ◯ Ruby on Railsのやり始めるとき、大抵の人がビビる！ ◯

こんにちは。誰でも分かるRuby on Rails攻略　〜ダレワカ〜　のコムリンです。

Ruby on Railsを始めようとするとき、まずはインストールしてみると・・・ビビりました？　ビビりますよね！？
<img width="234" alt="スクリーンショット 2019-10-20 14.54.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516809/8bfa7adc-381d-3295-5fd1-2235466cd15d.png">


私はもともとビビりなので、めちゃくちゃビビりました・・・


たくさんのフォルダ（ディレクトリ）が並んでいて何がなんのか全くわかりませんよね。

そこで、とにかく最初に紐解くべき事（１）が今回のテーマです。

---


Ruby on Railsをやっている方でしたら、Rubyはもう学習されているはずです。

１、コードを書く

２、ブラウザに結果を表示させる


HTMLやRubyでは、コードを書いたら即、表示を作ることができましたが、
Ruby on Railsでは、この基本的な作業を実行するためには、次の**「３つ」**を理解する必要があります。

>>１、　ルーティング　　　（routes）
>>２、　コントローラー  　　(controller)
>>３、　ビュー　　　　　　（view)　　　→　　HTML,Rubyで学んできた部分

１、　まず、ブラウザを開く際には、そのページのアドレスが必要ですね。
　　「ルーティング」はそのアドレスを指定する所です。

２、　次に、１で指定したページのバックグラウンドで作業や設定などの複雑な計算をする部分（アクションと言います）を
　　「コントローラー」で指定します。

３、　最後に、「ビュー」のファイルにHTMLやRubyで実際に表示されるコードを書きます。


ということで、ざっくり手間が「１」と「２」の二つ分増えるわけです。
1ページだけのホームページなら、ルーティングやコントローラーは不要かもしれませんが、そんなものは無料のツールで誰でも簡単に作れてしまいます。

通常、企業がお金をかけて（私たちが仕事として請け負うレベルのもの）作るものは、複数のページが色々と連携するように作られることがほとんどで、１と２の作業が必要になってくるので、初心者はまずはここで理解に苦しみます。


Ruby on Rails は「ルーティング」や「コントローラー」、「ビュー」などのフォルダ（ディレクトリ）が
それぞれ繋がっていて、それぞれが反映されるようになっているので、離れているフォルダ（ディレクトリ）同士でも勝手に連携してくれます。

<img width="1431" alt="スクリーンショット 2019-10-20 14.50.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516809/35795caa-c13f-c9f9-b323-f65a6118f107.png">

一つのホームページやシステムを作るのに欠かせない最低限の部分ですので、
どこに何があるのか最初はわかりずらいですが、まずはこの三つの場所と上記のような関係を頭に入れましょう！
Maven で「詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください」と表示されたときの対処

## 「詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください」と言われる

```
$ mvn compile
(中略)
[WARNING] /Users/az/app/src/main/java/MyApp.java: /Users/az/app/src/main/java/MyApp.javaの操作は、未チェックまたは安全ではありません。
[WARNING] /Users/az/app/src/main/java/MyApp.java: 詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください。
```

## 対処方法

pom.xml の plugins 要素に以下のように Compiler Plugin の設定を追加する。

```xml
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.8.1</version>
  <configuration>
    <compilerArgs>
      <arg>-Xlint:unchecked</arg>
    </compilerArgs>
  </configuration>
</plugin>
```

これで具体的な警告内容が表示されるようになる。

```
[WARNING] /Users/az/app/src/main/java/MyApp.java:[50,17] raw型java.util.Mapのメンバーとしてのput(K,V)への無検査呼出しです
[WARNING] /Users/az/app/src/main/java/MyApp.java:[53,12] 無検査変換
  期待値: java.util.Map<java.lang.String,java.lang.Object>
  検出値:    java.util.Map
```

## 今回の環境

- Apache Maven 3.6.2
- OpenJDK 11.0.2

## 参考資料

- [Apache Maven Compiler Plugin – Introduction](http://maven.apache.org/plugins/maven-compiler-plugin/)
- [Maven Repository: org\.apache\.maven\.plugins » maven\-compiler\-plugin](https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-compiler-plugin)
(2019年版)コマンドラインからclを使ってコンパイルできるようにしたので共有する

###はじめに
　こんにちは。この記事はVisualStudio2019に付属するcl.exeをコマンドラインから使えるようにしたときにした作業のメモです。私は結構前からwindowsネイティブなC言語環境を使ってみたいと思ってました。ちょっと前まではgccを使っていて、それでも不満は特になかったんですが、どーせwindowsを使っているならそれ専用のものを使いやすくしたいなという気持ちです。自分みたいに困っている人がいたとしたら参考にしてください。

###環境
まっさらな所から始めたかったのでwindows sandboxを使用

###概要
1.VisualStudio2019をインストール。適切なコンポーネントもいれる。
2.x64 Native Tools Command Prompt for VS 2019を起動して必要な環境変数を確認して登録する。
3.コマンドよりコンパイルしてみる。

###VisualStudioをインストール
https://visualstudio.microsoft.com/vs/
->communityをインストールします
![01 インストーラー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450564/a600d6e2-e3cb-8fc1-b8c8-d474bb003960.png)
画像のようにwindows系と右下のwindows10sdk最新のバージョンとMSVCの二つにチェックを入れインストールする。

clが動くようにパスに通す。Pathの末尾に登録する。
-> C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\bin\Hostx64\x64
通したらこの時点でできるか試す。
![03 clのパス確認 (2).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450564/32965132-9de4-90d1-42cd-96413063b177.png)
こんな感じになったらok

###x64 Native Tools Command Prompt for VS を起動
最近追加されたものの中にある`x64 Native Tools Command Prompt for VS`を起動する。
このプロンプトから以下のソースコードがコンパイルできるか試す。

```C:main_c.c
#include <stdio.h>
int main(){
    printf("Hello MSVC");
    return 0;
}
```

```C++:main_cpp.cpp
#include <iostream>
#include <string>
using namespace std;

int main(int argc, char *argv[]) {
    char str[] = "hello";
    string str_2 = " cl.exe";
    cout << str << str_2 << endl;
    return 0;
}
```

`C:\Program Files (x86)\Microsoft Visual Studio\2019\Community>cl /EHsc C:\Users\{ユーザー名}\main_c.c`
`C:\Program Files (x86)\Microsoft Visual Studio\2019\Community>cl /EHsc C:\Users\{ユーザー名}\main_cpp.cpp`

この時点でエラーとかxxx.libがありません的なメッセージが無いなら90％勝ったようなものです。

環境変数を確認する
`echo %INCLUDE%`
`echo %LIB%`
`echo %LIBPATH%`
![03 環境変数の確認 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450564/22faf476-98fe-6548-e7b0-582f19c02c71.png)

これらをそれぞれべたっと環境変数に登録します。
![04 こんな感じになる (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450564/a2ea1308-3d77-f59c-4e6d-8761b53f64cb.png)
こんな感じになる。

###ソースをコンパイル
一回さっきのプロンプトを閉じてcmdを素で起動する。
さっきと同じ同じようにコンパイルする。
`C:\Users\{ユーザー名}>cl /EHsc main_c.c`
`C:\Users\{ユーザー名}>cl /EHsc main_cpp.cpp`
![05 上手くいったとき (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450564/c435d716-1531-8c91-3200-269a37a32e2b.png)
`C:\Users\{ユーザー名}>main_c.exe`
`C:\Users\{ユーザー名}>main_cpp.exe`
![06 result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450564/fbe3db04-ee13-94d1-0b8c-9a4dd75dd45e.png)

###おわりに
　ネットだとやれkernel32.libが無いとかcorecrt.hが無いとかであって、バージョン違いで情報が錯綜していて分かりずらいので、まあ成功例の一つとして報告しておきます。この記事を書くためにsandboxを起動したときは少しは苦戦するかなとおもったらまったく詰まらず組み立てられたので今まで自分は何をしていたのだという気分です。
　ところでC言語弱者の私に/EHscコマンドの意味を教えてください(公式ドキュメントみてもわからんかった)。お願いします。

###追記
いろいろいじろうと思ったら`windows.h`が開けなかったので対処しました。
自分の環境でという話ですがとりあえず解決したので参考までに
`C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\shared`
`C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um`
この二つをINCLUDEの末尾に追加する。
ハッカソンのためのDataSpiderリンク集

ハッカソンでDataSpiderを使って開発をする際に、きっとあなたを助けるであろう記事をまとめました。

#DataSpiderを使ってみたい！
[DataSpiderを使った連携処理開発の進め方](https://qiita.com/hiroyoshi_wakino/items/b4468538176fca812bc8)

[ハッカソンでDataSpiderを使って開発をする](https://qiita.com/hiroyoshi_wakino/items/1e678c1168a8d79d02d3)

#データの変換・加工がしたい！
[【はじめてのDataSpider】CSVファイルからJSONに変換してみる](https://qiita.com/hiroyoshi_wakino/items/bfa5d3f427c3b5cc49fd)

[JSON形式のレスポンスデータを作成する](https://qiita.com/hiroyoshi_wakino/items/d8fa8c3cd77531e2f371)

[DataSpiderのMapperにおけるjsonスキーマ読み取り方法]
(https://qiita.com/y-tsushima/items/3f191812f00a9ba8724e)

[プロジェクト間で共通の変数を利用する方法](https://qiita.com/hiroyoshi_wakino/items/e3e24bfb2afe3e180b51)

#サービスと連携がしたい！
[Twilio REST API を使用して DataSpider から電話をかける](https://qiita.com/enk/items/94e7b74036475d2fdd47)

[DataSpider × kintone連携](https://qiita.com/y-tsushima/items/3b98752f039cfc934369)

[DataSpiderを使ってMicrosoft Cognitive ServicesのEmotion APIを呼び出す](https://qiita.com/hiroyoshi_wakino/items/2573d57cd62a778df61d)

[DataSpiderを使ってLINE Messaging APIを試してみる](https://qiita.com/hiroyoshi_wakino/items/1065f9941463b8f6829b)

などなど。リンクはたまに更新します。
【Swift5.1】DuctTapeで初期化時の値の代入をもっと簡潔にする

# はじめに

Swiftでオブジェクトのインスタンス化をしつつpropertyに値を代入する場合は、以下のような実装になるかと思います。

```swift
let label: UILabel = {
    let label = UILabel()
    label.numberOfLines = 0
    label.textColor = .red
    label.text = "Hello, World!!"
    return label
}()
```

上記と同じ状態のインスタンスを、メソッドチェーンで実現する方法を紹介しようと思います。

# [DuctTape](https://github.com/marty-suzuki/DuctTape)を利用する

[DuctTape](https://github.com/marty-suzuki/DuctTape)というOSSを利用することで、先程の実装を以下のような実装にできます。

```swift
let label = UILabel().ductTape
    .numberOfLines(0)
    .textColor(.red)
    .text("Hello, World!!")
    .build()
```

NSObjectを継承したオブジェクトのインスタンスの`.ductTape`にアクセスすると、Builderが返ってきます。
値を代入したいpropertyがある場合、そのproperty名と同一名のclosureにアクセスできるので、closureの引数として代入したい値を渡します。
一通りの値の設定が終わったら`.build()`を呼び出すことで、任意の値が代入された状態のインスタンスが返されます。

### メソッドにアクセスする場合

インスタンスのメソッドにアクセスしたい場合は、Builderの`.reinforce`を介してインスタンスにアクセス
できるようになるため、渡されたインスタンスからメソッドにアクセスします。

```swift
let collectionView = UICollectionView().ductTape
    .backgroundColor(.red)
    .reinforce { $0.register(UITableViewCell.self, forCellWithReuseIdentifier: "Cell") }
    .build()
```

### NSObjectを継承していないオブジェクトでも利用する

以下のように、Builderのinitializerの引数にインスタンスを渡すことで利用が可能になります。

```swift
class Dog {
    var name: String = ""
}

let dog = Builder(Dog())
    .name("Copernicus")
    .build()
```

# DuctTapeの仕組み

Swift5.1から利用できるKeyPath dynamicMemberLookupを利用して実装してします。
そのためpropertyごとに代入用の処理を実装する必要はなく、`subscript<Value>(dynamicMember keyPath: ReferenceWritableKeyPath<Base, Value>) -> (Value) -> Builder<Base>`を実装してしまえば、返り値のclosureの引数で受け取った値をKeyPathを介してインスタンスに代入する処理を実現できます。
また、KeyPath dynamicMemberLookupによる実装のため、該当のproperty名が自動補完されます。

```swift
@dynamicMemberLookup
public struct Builder<Base: AnyObject> {

    private let _build: () -> Base

    public init(_ build: @escaping () -> Base) {
        self._build = build
    }

    public init(_ base: Base) {
        self._build = { base }
    }

    public subscript<Value>(dynamicMember keyPath: ReferenceWritableKeyPath<Base, Value>) -> (Value) -> Builder<Base> {
        { [build = _build] value in
            Builder {
                let object = build()
                object[keyPath: keyPath] = value
                return object
            }
        }
    }

    public func build() -> Base {
        _build()
    }
}
```
Ruby on Railsにスタイルを反映させる手順


# 概要
Webアプリのscssファイルを更新しても本番環境に変更が反映されませんでした。
httpdリスタートしたりpassengerをリスタートしたりしま
したが変わらず。。。
## 解決方法
何が問題なのかと調べた結果、<a href="https://tamosblog.wordpress.com/2013/03/11/assets/">こちら</a>を参考にしました。

## 環境
ruby 2.3.3
rails 5.1.7
SAKURA VPS
CentOS 6

### 手順
```コマンドプロンプト
$ rm -rf public/assets
$ rm -rf tmp/cache
$ bundle exec rake assets:precompile
$ sudo service httpd restart 
```

1,2行目：実行するプロジェクトのassets,cacheフォルダを削除
3行目:プリコンパイルを行う
4行目：httpdをリスタート

以上の流れで、変更したscssファイルが反映されました。
私としては、アプリで利用するファイルの一部が残っていたので削除してもう一度作り直す、という理解になっています。

何か違う！というのがあれば教えてください！！
動画ファイルを無料・無広告で、DVDプレーヤーで再生できる形式に書き込む

#経緯
- 結婚式のプロフィールムービーを自作
- Windows Movie Maker(ムービーメーカー)では、なぜかDVDへの書き込みが表示されない
    - 他サイトの説明にある「DVDへの書き込み」がない...
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253915/35811ed2-d085-ab3d-9352-d5a60f3e99d4.png)
- 書き込むツールはいろいろあるが、どれも有料（というか課金しないと透かし広告が入る、それは無理）
    - DVD Memory
    - BurnAware
    - DVDStyler
- 最終的に以下の方法で無料・無広告でDVDに焼けたが、意外と解決まで躓いたので自分へのメモ用に残す

#前提
- Windows10（Macだと簡単にできるらしい。初めてMacいいなって思った）
- DVD Flick（あまりツール入れたくなかったけどこれは仕方ない）

#流れ
##①動画ファイルを作成する
- 筆者はムービーメーカーを使用
- ムービーの保存 - コンピューター用から「mp4」で良いと思う
- 4:3, 16:9は式場が使うプロジェクタによって決まっているので注意
- 左右上下両端は映らない場合があるので少し開けておいた方がよい

##②動画ファイルをISO形式に変換する
- DVD Flickを使用。ググってDL&インストール
    - 自分が使ったのは以下のボタンのみ
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253915/890cf14e-25f2-55aa-5135-1594334d55b5.png)


    - Add title: ①で作成した動画ファイルmp4を追加
    - Project setting: DVDの種類（DVDが片面/両面とか映像形式とか。日本ではほとんど「NTSC」らしい。PALだと再生できなかった。あと、）
    - Burning - Create ISO imageにチェック
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253915/26bdbfb6-9e82-7f35-8cd7-c9ea6b6efc77.png)
- Menu setting: メニューどうするか。NoneだとDVD入れた直後に自動で再生
- Project destination folder: ISOファイルの出力先を指定
- Create DVD: ISOファイル出力

##③ISO形式からDVDに書き込む（Windows標準の機能）
- エクスプローラで出力されたISOファイルを選択する
- 上部のディスクイメージツール - 書き込み
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253915/e34d9f24-8995-b9d5-e365-ca383d5147f9.png)

以上。
Xcode11で新規作成したプロジェクトをiOS13以前の端末で実行できるようにする方法

# はじめに

Xcode11はSwiftUIやiPadOS向けのマルチタスク強化などあり、環境変化があると思います。
今回は、アプリの開発要件がiOS12以降などの場合にどうすればいいのかを手順書みたいにまとめます。

# 実際にやってみる

今回は、iOS12.0以降にする前提で進めます。
[githubにサンプルプロジェクト](https://github.com/FromF/iOS12onXcode11)をアップしていますのであわせて参考にしてください。
（手順ごとにコミットを分けています。）

## 手順1 iOS Develoyment Targetを変更する

プロジェクト設定のInfoタブより **iOS Develoyment Target** の項目を12.0にします。

<img width="882" alt="スクリーンショット 2019-10-20 13.37.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/8837ada5-35b6-723f-cc9c-ae09efb580d1.png">

## 手順２ ビルドエラー箇所を修正する

iOS13以前で非サポートメソッドが全てエラーとなります。
`@available(iOS 13.0, *)`をつけてビルドエラーを解決します。
詳しい変更箇所は、[githubのcommitログ](https://github.com/FromF/iOS12onXcode11/commit/1c0b062d3076aae90ce889c422c3b735c82d9744) を参考にしてください。

【エラー画面】
<img width="717" alt="スクリーンショット 2019-10-20 13.40.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/81781126-08c8-f3af-9cc0-8d31301fff74.png">

【修正後】
<img width="720" alt="スクリーンショット 2019-10-20 14.03.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/8f31e228-4240-88c3-b4a3-44a6a90ba299.png">

## 手順３ デバックウィンドに表示されるエラーを解決する

ここまでで一見大丈夫そうなのですが、iOS12上で実行すると画面は真っ暗でなにも表示されません。
デバッグウィンドには **[Application] The app delegate must implement the window property if it wants to use a main storyboard file.** と表示されています。

【デバッグウィンドの表示例】
<img width="433" alt="スクリーンショット 2019-10-20 13.48.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/780e1a9b-5128-14e1-d64f-17bafd24aae6.png">

これは、storyboardファイルがうまく読み込めていないようです。
`AppDelegate.swift` に `var window: UIWindow?` を追加することで解決できます。

【 `var window: UIWindow?`を追加した例】
<img width="690" alt="スクリーンショット 2019-10-20 14.07.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/95c0233b-1f68-87f3-600e-37b2b46eb9d4.png">

以上で終わりです。

# 最後に

他の方も記載されていますが、いまいちよく分からなかったので自分なりにまとめました。
参考にした。記事のリンクを記載させていただきます。

## 参考記事

* [SceneDelegateのせいでiOS12以下のビルドが通らない](https://qiita.com/sakuto0116/items/7caad22f041375810c9c)
* [Xcode11で古いプロジェクトテンプレートを利用する](https://qiita.com/snoozelag/items/9fdc9128dc71b6f39171)
多次元配列のインデックスの順番

## はじめに
Juliaには多次元配列が用意されているが、CやJava育ちの人間からするとインデックスの付け方がとてもわかりにくいのでまとめてみた。

## Javaの場合
Javaには多次元配列はなく、配列の配列が書けるだけだ。3次元の配列（というか配列の配列の配列）は
次のように書く。

```Java
int [][][] a = new int[2][3][4];
```
この場合、最内周になるのは一番右のインデックス（この場合は長さ4のもの）だ。

## Cの場合
Cでは多次元配列も配列の配列も書ける。宣言の仕方は全然違うのだけど、使い方はおなじなので大変紛らわしい。

まず配列の配列。宣言はポインタのポインタのポインタとして定義して、`malloc`で中身を個別に確保する。面倒くさい。

```c
  char ***array2;
  int counter = 0;
  array2 = (char ***) malloc(sizeof(char**) * 2);
  for (int i = 0; i < 2; i++) {
    array2[i] = (char **)malloc(sizeof(char*) * 3);
    for (int j = 0; j < 3; j++) {
      array2[i][j] = (char *)malloc(sizeof(char) * 4);
      for (int k = 0; k < 4; k++) {
        array2[i][j][k] = counter++;
      }
    }
  }

  for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 3; j++) {
      for (int k = 0; k < 4; k++) {
        printf("%d ", array2[i][j][k]);
      }
      printf("\n");
    }
    printf("\n");
  }
```
`malloc`の返り値チェックしていないとかは気にしないでほしい。

多次元配列の場合は、もう少し楽。メモリ領域が連続しているので一括で確保できる。注目してほしいのは出力部分でのアクセスの仕方が全く同じ形`array[i][j][k]`になっていること。

```c
  char array[2][3][4];

  char * v =(char*) array;
  for (int i = 0; i < 24; i++)
    *v++ = i;

  for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 3; j++) {
      for (int k = 0; k < 4; k++) {
        printf("%d ", array[i][j][k]);
      }
      printf("\n");
    }
    printf("\n");
  }
```
出力はいずれの場合も

```
0 1 2 3 
4 5 6 7 
8 9 10 11 

12 13 14 15 
16 17 18 19 
20 21 22 23 
```
となる。いずれにしろ、最内周に対応するのは、1番右側のインデックスだ。

##Python numpyの場合

numpy の場合もCやJavaと同じ。つまり最内周のインデックスは一番右。

``` python
>>> np.arange(0, 24).reshape(2,3,4)
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
```

## Juliaの場合
これがJuliaだと逆になる。つまり最内周に対応するのは、一番左のインデックスだ。全く同じような感じで`reshape`しても結果がnumpyの場合と全く違うのがわかる。

``` julia
julia> reshape(0:23, (2, 3, 4))
2×3×4 reshape(::UnitRange{Int64}, 2, 3, 4) with eltype Int64:
[:, :, 1] =
 0  2  4
 1  3  5

[:, :, 2] =
 6  8  10
 7  9  11

[:, :, 3] =
 12  14  16
 13  15  17

[:, :, 4] =
 18  20  22
 19  21  23
```

また、2次元配列を書く際の順番もカラム優先になっていることがわかる。

JuliaはPyCallでPythonのライブラリが呼び出せるのだけど、その時の値の受け渡しで、いろいろ面倒なことが起きそうな気がする。。


## 所感
多次元配列の場合には、どのインデックスを内周にするのかは言語設計者が任意に決められそうなのだけど、配列の配列を書く場合には、必然的に後ろ（右側）のインデックスが内周にならざるを得ない。

Juliaで最初のインデックスが内周になっているのはFortranの伝統なのだろうと思うのだけど、なんでFortranはそうしたんだろう。なにか必然性があるのか、ただ偶然そうしただけなのか。偶然だとするとかなり不幸な偶然だな。。
Kerberos認証サーバ構築 Debian系

raspbian buster@Raspberry pi3 b+の上に、MIT Kerberos認証サーバーを立てる手順をまとめます。

# インストール

```shell
sudo apt install krb5-admin-server krb5-kdc
```

# 設定

## KDCサーバー

```conf:/etc/krb5kdc/kdc.conf
[kdcdefaults]
    kdc_ports = 750,88

[realms]
    ${realm domain} = {
        admin_keytab = FILE:/etc/krb5kdc/kadm5.keytab
        key_stash_file = /etc/krb5kdc/stash
        acl_file = /etc/krb5kdc/kadm5.acl
        max_life = 10h 0m 0s
        max_renewable_life = 7d 0h 0m 0s
        default_principal_flags = +preauth
    }
```

```conf:/etc/krb5kdc/kadm.acl
root/admin@*  *  */*@*1
```

## KDCクライアント

```conf:/etc/krb5.conf
[libdefaults]
    default_realm = ${default domain}

[realms]
   ${realm domain} = {
        kdc = ${kdc domain} # なくても良い
        admin_server = ${kadmin domain}
        database_module = openldap_ldapconf
        default_domain = ${domain}
   }

[domain_realm]
    {domain} = {realm domain}
```

# サーバーの起動

```shell
sudo systemctl start krb5-admin-server
sudo systemctl start krb5-kdc
```

# 認証サーバーの操作

## 管理者principalの追加

```shell
sudo kadmin.local [-r ${realm}]
```

を実行すると、認証サーバー管理用の対話型プログラムが起動します。これを使って、リモート管理用のprincipalを作ります。

```shell:kadmin.local
addprinc root/admin[@${realm}]
```

## ユーザーprincipalの追加

```shell:kadmin.local
addprinc ${user}[@${realm}]
```

パスワードの設定を求められるので、任意のパスワードを設定します。

## サービスprincipalの追加

サービスを提供するサーバー上で、

```shell
sudo kadmin -p root/admin [-r ${realm}]
```

を実行し、認証サーバー管理用の対話型プログラムを起動する。

```shell:kadmin
addprinc -randkey ${type}/${FQDN}[@${realm}]
ktadd ${type}/${FQDN}[@${realm}]
```

randkeyオプションを付けなかった場合は、普通にパスワードを設定します。randkeyオプションを付けた場合は、鍵がランダムに生成されるので、パスワードの設定は必要ありません。そのため、パスワードでの認証はできないので、ktaddでサーバー上のkeytab追加される鍵情報を使って認証します。

ktaddで鍵をkeytabに追加するときは、鍵が新たに作られます。それに伴い、古い鍵は使えなくなるので、keytabを用いた認証ではSingle Sign On的なことはできません。

# SSHの認証にKerberosを使う

[過去の記事](https://qiita.com/kanatatsu64/items/1bb825d0e457f6c9a10c)を参照してください。Kerberos認証を使うことにより、Single Sign Onが実現できます。
IBM Cloud: サービスの削除

IBM Cloudはライトプランを使用して無料でサービスを使用することができます。ライトプランの場合は1サービスにつき1つしか作成できない制限があるので、時には既存のサービスを削除しないといけない場合があります(Node-RED Starterを使用する場合など)。また何らかの不具合をリセットするために削除して作り直す場合もあります。

ここではIBM Cloudのサービスの削除の方法を説明します。

##1: IBM Cloudにログイン
https://cloud.ibm.com/login よりIBM Cloudにログインしてください。

既にログイン済みの場合は左上の`IBM Cloud`のロゴをクリックして、ダッシュボードを表示してください。

#2:  表示されたダッシュボードの[リソースの要約]から`リソースの表示`をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/52b9bdb9-8204-e76e-e658-22c529d83639.png)

#3: `Services`の文字をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/f2af20a4-badd-7717-1fca-35c24e2e1fe8.png)

#4: 削除したいサービスの右側にある`・・・`をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/17c34b48-feeb-2f54-26e6-6047bbeb21ce.png)

#5: 表示されたメニューから「削除」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/6c07b28e-7e0f-d3c4-70a1-ef20ff58cfe4.png)

#6: 確認のダイアログが出るので、「削除」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/71053a57-c82b-95b5-1bec-4f9e62b27601.png)

#7:　状況が「削除中」となります。
削除されるとそのサービスの行も削除されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/338a9ed9-b5e0-6903-b0c6-080a8256e29b.png)

以上です。
MacのMySQLでECONNREFUSED

## なかなかOKが出なかった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/658f53e4-a40f-ce96-8db7-eca27c8a5aca.png)

## 環境
macOS Catalina(10.15)
MySQL 8.0.17(Homebrew)

## 経緯

[Qiitaの記事](https://qiita.com/noralife/items/4c9b975e9d1d664720a0)を読んで、Node-REDをやってみようとして、MacのローカルにMySQLを導入したものの、どうしても「ECONNREFUSED」(接続拒否)が出て繋がらず。

`mysql.user` テーブルには `'root'@'localhost'` があるものの、どうやら `127.0.0.1` からのアクセスとして認識されている模様。
`/etc/hosts` に `127.0.0.1	localhost` があるんだから、良いじゃないか……と思っても、繋がらないものは繋がらない。

じゃあ別に追加しないといけないのか……ということでユーザを追加しようとしたら、MySQL8は構文が違うということでエラーになりました。

[参考]のところを参考にさせていただいて、ようやく解決。

```
mysql> create user 'user'@'127.0.0.1' identified by 'password';
mysql> grant all privileges on {DATABASE_NAME}.* to 'user'@'127.0.0.1';
```

## 参考

[Mysqlのgrant文でユーザ作成&権限付与しようとしてエラーが出たのでメモ](https://qiita.com/yamateion/items/5509484aaf1a02e9cc57)
阿里雲MVP全球閉門會 2019 參與報告 (中文版)

這是MVP全球閉門會的報告. 雲栖大會的報告是另外寫的(預定).


## 關於阿里雲MVP全球閉門會

這就是雲栖大會的前一天阿里雲舉辦的峰會,從全世界好多MVP們來參與.
參加人數是約80名.雖然大部分是中國人但約20名的外國人也參與了.
今年阿里雲公司讓我當MVP所以我也參與了.
<A HREF=https://www.alibabacloud.com/blog/alibaba-cloud-mvps-at-the-apsara-conference-2019---leading-sharing-and-changing_595422 target=_blank>官方報告在這裡</A>. 應該看那個網站就夠了吧,所以我在這頁寫一些自己的感覺哈哈.


## 會場在校園裡

![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96018/02b7d46c-7456-a3de-e0d2-4c0ae073b471.jpeg)
入口就在校園裡.
不用擔心我進去了.
進去校園裡就..

![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96018/eb0530bd-e5cc-e986-9c71-545d7582506d.jpeg)
出現寫下阿里雲跟MVP的歷史的大看板了.
阿里雲的MVP制度開始兩年了. 我覺得繼續會發展.

![03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96018/98aa0a08-84f7-9ab8-0977-1d9c68daa6e4.jpeg)
峰會基本上以中文舉行.
連這位西方人也會講中文很流利我嚇一跳了.
我們也得加油. 繼續努力..

![04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96018/6dfe838a-01f0-d831-e2fb-71260c734a9d.jpeg)
演講的題目沒有限制各位MVP演講自己有興趣的內容.
在IoT方面中國是比較發達國家.有的中國MVP演講物聯網有關的.

時間過得很快,晚上我們去吃飯.
![05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96018/28c9c7a0-7c96-4734-8467-ada67acc4f5e.jpeg)
看板看起來豪華..

![06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96018/8a72ae2e-6eee-ea81-1f18-d58644e5a779.jpeg)
我們去員工食堂.
大家一起吃飯了.

其中我在裡面發現中國風的東西.
![07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96018/c3ff065d-e09f-5b9f-2882-642a11feebf6.jpeg)
廚師現場做麵.
可以進去員食堂的機會很少,這也很好玩.


## 產品夜談

雲栖大會的期間中晚上舉行產品夜談.
但,先吃飯吧.
![08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96018/87211ed6-f355-036f-d44c-66b98f35b7a6.jpeg)
這次也在一樣的阿里雲校園裡但是餐廳較大.
好像是美食廣場的感覺裡面有些美食店.
![09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96018/7de01d32-e5db-3a93-e49b-5515e17155f0.jpeg)
我們吃完就要去教室了.

![10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96018/39177dfe-c8cd-588d-b6ca-e49cf3290cc4.jpeg)
我覺得這活動就是最有意義的MVP活動.
每桌有開發阿里雲的各種服務的專業人,我們隨便可以坐然後向他們問一下談事情都可以.

![11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96018/b29fbe26-7b0c-1dc9-d53a-0f1c87e3a863.jpeg)
每座桌子都很熱鬧,兩個半小時的時間過的很快活動結束了.


## MVP訪問,Webinar

需要的MVP可以舉行訪問跟Webinar.
本來我也報名但後來知道訪問只可以用英文我就放棄了.
聽說這些都是向海外播的所以用中文是不行..
但是.明年有可能官方會準備翻譯人.
我的髒話翻譯到英文播出的時間快要來了!?


## VIP展位參觀
為了MVP們有英文翻譯的展位參觀舉行了.
![13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96018/c64376b6-8ceb-209a-7277-8e0cb2dc75a4.jpeg)
為了從日本來的來賓們這段時間我當導遊不能參與這些活動. 下次吧!


## 在廁所裡
![12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96018/90871665-9a12-0582-ab9c-c563095c3197.jpeg)
寫的內容很好.
這樣跟亞馬孫的領導原則很像.
我覺得好公司都有很好的行為守則.


## 總結

有跟開發服務的人談話的機會是非常好處.
比如說AWS的話這樣機會是當重要的客戶才拿到.平常我們沒有機會.
希望我明年也可以參與MVP全球閉門會.
文字列フォーマットの標準API

# String.format
``` String#format.java
String formated = String.format("私は%sです。", "太郎");
```

# MassageFormat#format
``` Message#format.java
String template = "私は{0}です。";
String formated = MessageFormat.format(template, "太郎");
```

# パフォーマンス
MassageFormatの方が断然早い。

| API       |      10,000回実行 |    100,000回実行    |
|:-----------------|------------------:|:------------------:|
| String#format             |   0.2269983S    |  1.2679988S  |
| Message#format           |  0.0730008S |      0.2999999S   |
シェルで標準出力と標準エラー出力を別々のファイルに書き出す

`bash`だと方法がたくさん出てくるのだけど、`csh`ではなかなか見つからなかったので、メモ。

# bash系

標準出力をfile1に、標準エラー出力をfile2に書き出し

```
command 1> file1 2> file2
```

標準出力と標準エラー出力を両方ともfileに書き出し

```
command &> file
```

# csh系

標準出力をfile1に、標準エラー出力をfile2に書き出し

```
(command > file1) >& file2
```

標準出力と標準エラー出力を両方ともfileに書き出し

```
command >& file
```

# 空出力

fileに`/dev/null`を指定すると、空出力する
UiPathでお手軽に自動化ができるStudioXが使えるようになったらしい

# はじめに
UiPath StudioXなるものが登場したそうです。
https://forum.uipath.com/t/uipath-studiox/159600

>従来のプロファイル (Studio) と ビジネスユーザー向けの簡潔なプロファイル (StudioX) に切り替えられます。ビジネスユーザー向けのプロファイルでは、ボタン数もぐっと減り、アクティビティ名もテクノロジーにあまり明るくない人にもわかりやすく表示されています。

# 試してみる
## StudioXのプロファイルの切り替え
(1)[License and Profile]の[View or Change Profile]を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/80eecf32-b850-1859-3576-8d94c9743f57.png)

(2)UiPath StudioX を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/6c4fb5c8-17da-03aa-8fd3-5a309dd10ffd.png)

(3)再起動を聞かれるので「はい」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/c1e87174-d24b-885c-9862-b865e21d3cb0.png)

(4)UiPath StudioXが開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/2d4785b9-0675-35b3-6097-18c7d5cfca4e.png)

(5)ホーム→ツール→Excelアドインをインストールする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/e26506c9-9483-cee9-24a6-af9c581bcadf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/15f5edff-225d-883a-c781-cfd15a83dd84.png)
※うまくいかなかったらUiPathを一度再起動してみてください。

## 簡単な操作をやってみる。
電卓のボタンを押して、表示内容をExcelに張り付けるサンプル

(1)タスクオートメーションの作成を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/4f089579-fc91-11bd-3344-f0fbada65ed3.png)

(2)以下のような画面が開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/53553b7b-7fc6-a7f8-852d-5b5507db08e8.png)


(3)アプリケーションカード等を設置する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/78aa44ae-2a40-ccaf-2871-e11c0c40178e.png)

(4)アプリケーションカード内の「アプリケーションを指定」を指定すると画面上のWindowsを選択できるので電卓を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/51fb5dfc-9189-a09e-e94f-b0c1d00e2b17.png)

(5)「クリック」アクティビティをアプリケーションカード内にドロップして「ターゲットの選択」後、電卓上のボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/97202989-6e45-7aad-69e3-c2fa0072ab3f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/f596c90f-9807-ce03-abd4-5feda0ae5602.png)

(6)テキストの取得をドロップ後、ターゲットの指定で電卓のテキストボックスをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/aa479090-2429-302b-3e26-b08bff32145f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/d6dd6dfd-1d32-2991-28ce-b5f4af42a438.png)

(7)「テキストを保存」アクティビティの保存先で「Excel内で示す」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/7aab91c5-ff3e-fcd8-c7d2-7806ee4b56b6.png)

(8)Excelが起動するのでテキストを保存したいセルを選択して「Confirm」を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/dcb00817-3a70-c00e-0641-620fd9079b72.png)

**実行結果**
![uipath1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/33611e61-11a6-7783-ae5f-6842281e2582.gif)

**プロファイルを戻して開き直した場合**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/209b2385-3df7-08ba-c3f7-5133ace7e73d.png)
※StudioXで作ったものを従来のもので開くことは可能ですが、逆は無理そうです。

# 感想
たしかにVB.NETの知識がなくても組めるようになったようなので「**テクノロジーにあまり明るくない人にもわかりやすく**」なったかと思います。
IDAをkali for linuxにダウンロード

##はじめに
ダウンロード方法がネットに上がっていたのですが，割と詰まったので屍を超えていってほしいと思い書きます。
## IDAのダウンロード
* [IDA free Freeware 7.0](https://www.hex-rays.com/products/ida/support/download_freeware.shtml) をダウンロード
* 今回はkaliに入れるのでlinuxを選択してダウンロードしてください

## 展開から起動まで
* そのまま開こうとしても開かない
* terminal を開く
* idafree70_linux.run があるディレクトリに移動
* `chmod +x idafree70_linux.run`
* `ls -l`で -rwxr-xr-x となっていることを確認
* `sudo ./idafree70_linux.run` 
* IDAのセットアップが立ち上がる
* 同意してダウンロード
* Terminalに戻り，`sudo ln -s /opt/idafree-7.0/ida64 /usr/bin/` 
* `ida64`
* これでやっと起動できる

## 参考
https://www.youtube.com/watch?v=3FnyzJ6bTEs&t=108s
C++ で重複削除を行う関数 unique の使い方 [ABC143 C問題]

重複削除を行うC++ の STL 関数 unique の使い方のメモ。
問題はここ：[ABC143 C問題](https://atcoder.jp/contests/abc143/tasks/abc143_c)

問題の趣旨は
「`aabbbbaaca` のような文字列が与えられて、隣合う同じ文字を一つにまとめて `abaca` のようにしたら何文字か？」
という感じ。

#コンテスト中に提出したコード
unique のことは知らなかったのでコンテスト中は以下のようなコードを書いた。


```submit.cpp
#include <bits/stdc++.h>
using namespace std;

int main(){
  int n; cin >> n;
  string s; cin >> s;

  int ans = 0;
  int i = 0;
  while(i < n){
    char c = s[i];
    ans++;
    while(s[i] == c){
      i++;
      if(i >= n) break;
    }
  }
  cout << ans << '\n';
}
```

見にくいしスマートじゃない…

#unique を使った解法
公式の解答では以下のようなスマートなコードが示されている。

```smart.cpp
#include <bits/stdc++.h>
using namespace std;

int main(){
  int n; cin >> n;
  string s; cin >> s;

  s.erase(unique(s.begin(), s.end()), s.end());
  cout << s.size() << '\n';
}
```

確かにスマートだけど unique を知らないから何をしているのかよく分からん…

#unique の使い方

unique は重複削除を行いたい文字列をsとすると
 `unique(s.begin(), s.end())`
とすることで文字列 s を
`aabbbcddaaa` ⇒ `abcda??????` (? はゴミ)
とし、最初の ? を指すポインタを返す。
この返り値を利用してゴミを erase すれば重複削除の完成！

```unique.cpp
#include <bits/stdc++.h>
using namespace std;

int main(){
  string s = "aabbbcddaaa";

  auto n = unique(s.begin(), s.end());
  // これで s = abcda となってほしい
  cout << s << '\n';//しかし s = abcda?????? とゴミが残る

  // unique は返り値として ? の先頭を指すポインタを返す
  // そこで n から最後まで erase すれば完成
  s.erase(n,s.end());
  cout << s << '\n';
}
```

これを全部まとめてしまえば

```smart.cpp
#include <bits/stdc++.h>
using namespace std;

int main(){
  int n; cin >> n;
  string s; cin >> s;

  s.erase(unique(s.begin(), s.end()), s.end());
  cout << s.size() << '\n';
}
```

となるわけですね。
ちなみに unique はもちろん配列にも同じ用法で使える。
Railsを5.0から6.0にアップデートしたらコンソールで日本語が使えなくなった問題の解決

# コンソールで日本語を入力したらエラーで強制終了されてしまう
Railsプロジェクトのバージョンを5.0→6.0に上げたら、Rails cで立ち上がるコンソールで日本語を入力すると、
`"\xE2" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)`
というエラーが発生し、強制終了するようになった。

# 解決策
Gemfileのdevelopmentグループにある`gem 'rb-readline'`を削除し、`$ bundle`を実行する。
これでエラーが発生しなくなりました。
なぜrb-readlineが問題だったのかわかる方、コメントお待ちしています、、、
Jupyter Notebook上でシェルコマンドに（擬似的に）標準入力を与える

小ネタです、需要があるのか知りませんが...

# 短く

```python
In[1]: std_in = input()
In[2]: !echo $std_in | your_command
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460873/fc1d30a0-1d02-ed88-9cd0-1b36ddc0da69.png)

# 問題
コマンドラインで実行するコマンドのいくつかは標準入力を受け付けます。上に示した`cat`もそうですが、現実的な例としては例えば、[JUMAN++](http://nlp.ist.i.kyoto-u.ac.jp/index.php?JUMAN++)という形態素解析ソフト[^1]は標準入力に日本語の文を渡すと、形態素解析結果を返します。

```shell
$ jumanpp
これはペンです
これ これ これ 指示詞 7 名詞形態指示詞 1 * 0 * 0 NIL
は は は 助詞 9 副助詞 2 * 0 * 0 NIL
ペン ぺん ペン 名詞 6 普通名詞 1 * 0 * 0 "代表表記:ペン/ぺん カテゴリ:人工物-その他"
です です だ 判定詞 4 * 0 判定詞 25 デス列基本形 27 NIL
EOS
```

「これはペンです」が標準入力、それ以降の行は出力です。

これをJupyter Notebook上で動かしたいという問題です。


# 前提など

IPython/Jupyter Notebookでは行頭に`!`をつけるとシステムコマンド[^2]（シェルコマンド）が実行されます。(なお`ls`など基本的なコマンドのいくつかは`!`をつけなくても実行されます)


```
In [1]:!ls
       Applications/
       Desktop/
       Documents/
       ...
```

標準出力は、pythonの変数に代入することもできます。


```
In [1]:filesandfolders = !ls
In [2]:filesandfolders
       ['Applications',
        'Desktop',
        'Documents',
       ...]
```

逆に、pythonの変数をコマンドの引数にすることもできます。変数名の先頭に`$`を付けるとコマンド列中で使えます。

```
In [1]:text = 'Hello!'
In [2]:!echo $text
       Hello!
```

しかし、Notebookでは前述の例のように標準入力を受け取ることはできません。（jupyter==1.0.0, notebook==5.7.8）（ipythonのインタプリタではできました）

# 解決
pythonの関数である`input()`は標準入力を受け付けます。Jupyter Notebook上でもいい感じの入力窓を出してくれます。（「短く」参照）
そうやって受け取った標準入力を`echo`でコマンドに渡してやればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460873/7ea445a8-8805-7346-40d1-e6dbadf985cf.png)

# 所感

```
In [1]:!echo "これはペンです" | jumanpp
```
で事足りる。が、標準入力を与えたいこともある...かもしれない。
# 参考文献

[Jupyter Notebookでシステムコマンドを実行し文字列のリストとして取得](https://note.nkmk.me/jupyter-notebook-system-command/)



[^1]: [Mecab](https://taku910.github.io/mecab/)とかもそうです。
[^2]: なんと呼ぶのが正確なのかわかりません。コマンドラインで実行するいわゆる"コマンド"です。
vbsの作法 その43

#概要

vbsの作法調べてみた。
winsock使ってみる。
OSWINSCK.Winsock調べてみた。


#メソッド

```
object.Accept(requestID As Long)
object.Bind([LocalPort], [LocalIP])
object.CloseWinsock()
object.Connect([RemoteHost], [RemotePort])
object.GetData(data, [vtype], [maxLen])
object.GetDataBuffer()
object.Listen()
object.PeekData(data, [vtype], [maxLen])
object.SendData(data)
```

#プロパテイ


```
object.BytesReceived As Long
object.LocalHostName As String
object.LocalIP As String
object.LocalPort As Long
object.Protocol As ProtocolConstants
object.RemoteHost As String
object.RemoteHostIP As String
object.RemotePort As Long
object.SocketHandle As Long
object.State As StateConstants (Long)
object.Status As String
```

#定数

```
	0	sckTCPProtocol	TCP Protocol
	1	sckUDPProtocol	UDP Protocol

	0	sckClosed			connection closed
	1	sckOpen				open
	2	sckListening		listening for incoming connections
	3	sckConnectionPending	connection pending
	4	sckResolvingHost	resolving remote host name
	5	sckHostResolved		remote host name successfully resolved
	6	sckConnecting		connecting to remote host
	7	sckConnected		connected to remote host
	8	sckClosing			connection is closing
	9	sckError			error occured
```

#イベント


```
object.OnClose()
object.OnConnect()
object.OnConnectionRequest(requestID As Long)
object.OnDataArrival(bytesTotal As Long)
object.OnError(Number As Integer, Description As String, Scode As Long, Source As String, HelpFile As String, HelpContext As Long, CancelDisplay As Boolean)
object.OnSendComplete()
object.OnSendProgress(bytesSent As Long, bytesRemaining As Long)
object.OnStatusChanged(ByVal Status As String)
```

以上
gnuplotをcatalinaで使おうとして失敗．



# イントロ

-   gnuplotをcatalinaで使おうとして失敗．
-   **結論:** 古いgnuplotを入れろ．

[brewのgnuplotのオプション指定ができなくなったので対処する](<https://anatofuz.hatenablog.com/entry/2019/04/28/114844>)        に従って．

    brew tap ie-developers/ie
    brew install ie-developers/ie/gnuplot  --with-cairo  --with-aquaterm


## 症状

1.  rubyでgnuplotがないと怒られた．
2.  gem install numo-gnuplot
3.  gnuplotがlibなしで動かない．
4.  brew install gnuplot &#x2013;with-aquaterm
    1.  したら，&#x2013;with-aquatermがナイト．．
5.  なしでinstallしたら，今度はnumo/gnuplotでエラー

```ruby
gnuplot.rb:307:in `run':  (Numo::GnuplotError)

_example
ruby site_ks_new.rb
Traceback (most recent call last):
...
/Users/bob/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/numo-gnuplot-0.2.4/lib/numo/gnuplot.rb:307:in `run':  (Numo::GnuplotError)
```


# 対処

-   [gnuplotのmacosでaquaterm](https://qiita.com/daddygongon/items/c9101967d34f646e619b)

にある通りに入れ直す．初めての人はaquatermも忘れずにinstall．してなかった場合は，以下の通りunknownが出ます．えっと，この間にXcodeも入れてます．

    > brew unlink gnuplot
    Unlinking /usr/local/Cellar/gnuplot/5.4.0_1... 3 symlinks removed
    > brew install ie-developers/ie/gnuplot --with-cairo --with-aquater
    > gnuplot
    	G N U P L O T
    	Version 5.2 patchlevel 6    last modified 2019-01-01 
    
    	Copyright (C) 1986-1993, 1998, 2004, 2007-2018
    	Thomas Williams, Colin Kelley and many others
    
    	gnuplot home:     http://www.gnuplot.info
    	faq, bugs, etc:   type "help FAQ"
    	immediate help:   type "help"  (plot window: hit 'h')
    
    Terminal type is now 'unknown'


## aquatermをinstall

aquatermをinstallして再度，brew uninstall gnuplotからやり直すと，

    gnuplot
    
    	G N U P L O T
    	Version 5.2 patchlevel 6    last modified 2019-01-01 
    
    	Copyright (C) 1986-1993, 1998, 2004, 2007-2018
    	Thomas Williams, Colin Kelley and many others
    
    	gnuplot home:     http://www.gnuplot.info
    	faq, bugs, etc:   type "help FAQ"
    	immediate help:   type "help"  (plot window: hit 'h')
    
    Terminal type is now 'aqua'
    gnuplot> plot sin(x)

と普通にaqua.

多分，rubyのnumo/gnuplotもいけるでしょ．いけた．めでたしめでたし．

&#x2013;with-cairo &#x2013;wtih-aquatermとしたときにerrorが出た場合でも同じ対応でok.

------
 - **source** ~/materials/al_twist/docs/qiita/gnuplot_install.org
差分バックアップと増分バックアップの違い

AWSのEBSのスナップショットは**増分バックアップ**であり、**差分バックアップ**ではないらしい。
で、この２つの違いは何？、と思ったのでメモ。

## 共通点
- 初回にフルバックアップをとる

## 増分バックアップ
- ２回目以降は前回からの増分のみをバックアップする。
- １回あたりのバックアップ容量は少なくてすむが、復元時の処理が煩雑。

1回目 / <font color="Red">[100GB]</font>
2回目 / <font color="Red">[100GB]</font> + <font color="blue">[10GB]</font>
3回目 / <font color="Red">[110GB]</font> + <font color="blue">[15GB]</font>

## 差分バックアップ
- 2回目以降は初回からの増分のみをバックアップする。
- バックアップ処理が簡易だが、世代が多いと容量がかさむ

1回目 / <font color="Red">[100GB]</font>
2回目 / <font color="Red">[100GB]</font> + <font color="blue">[10GB]</font>
3回目 / <font color="Red">[100GB]</font> + <font color="blue">[10GB]</font> + <font color="blue">[15GB]</font>
vbsの作法 その42

#概要

vbsの作法調べてみた。
winsock使ってみる。

#環境

windows7 64bit

#MSWinsock.Winsock

VB6のactivexなので、却下。

#OSWINSCK.Winsock

配布されていたので、使ってみる。

#サンプルコード

```
Option Explicit
Dim oWin
Dim sURL
Dim sPage
Dim sServer
Dim nPort
Dim sBuffer
Dim sSource
Dim bClose
Dim sProxy

Sub soc_OnClose()
	oWin.CloseWinsock
	WScript.Echo sSource
	bClose = True
	Set oWin = Nothing
End Sub

Sub soc_OnConnect()
	oWin.SendData "GET " & sPage & " HTTP/1.0" & vbCrLf & vbCrLf
End Sub

Sub soc_OnDataArrival(ByVal bytesTotal)
	oWin.GetData sBuffer
	sSource = sSource & sBuffer
End Sub

Sub soc_OnError(ByVal Number, Description, ByVal Scode, ByVal Source, ByVal HelpFile, ByVal HelpContext, CancelDisplay)
	WScript.Echo Number & ": " & Description
	oWin.CloseWinsock
End Sub

sURL = ""
sPage = ""
sServer = ""
nPort = 80
sBuffer = ""
sSource = ""
bClose = False
sProxy = ""
sURL = InputBox("Enter the URL", "OSWINSCK test", "http://www.ostrosoft.com")
sServer = Trim(sURL)
If InStr(sServer, "://") > 0 Then sServer = Mid(sServer, InStr(sServer, "://") + 3)
If InStr(sServer, "/") > 1 Then
	sPage = Mid(sServer, InStr(sServer, "/"))
	sServer = Left(sServer, InStr(sServer, "/") - 1)
	If InStr(sPage, "#") > 1 Then sPage = Left(sPage, InStr(sPage, "#") - 1)
Else
	sPage = "/"
End If
If InStr(sServer, ":") > 1 Then
	nPort = Mid(sServer, InStr(sServer, ":") + 1)
	sServer = Left(sServer, InStr(sServer, ":") - 1)
End If
If sServer <> "" Then
	Set oWin = CreateObject("OSWINSCK.Winsock")
	WScript.ConnectObject oWin, "soc_"
	If sProxy = "" Then
		oWin.Connect CStr(sServer), CLng(nPort)
	Else
		sPage = "http://" & sServer & sPage
		oWin.Connect CStr(sProxy), 80
	End If
Else
	sSource "Invalid URL"
	bClose = True
End If
While Not bClose
	WScript.Sleep 1
Wend





```

以上。